2013-07-18 6 views
4

문제 문자바 : 속성에서 키 이름을 사용하여 내가 속성 그건 내 자바 프로젝트를 통해 액세스 프로그램의 파일이 키

으로 하드 코딩 된 문자열을 사용하지 않고 파일. 내 .properties 파일의

예 내용 :

appName=MyApp 
appType=TypeA 

props.getProperty("appName"); 

내가 속성을 반복하지 않으려는 이제 내 모든 자바 프로젝트 전체는 하나의 속성, appName에 액세스한다고 가정 해 봅시다 속성 값을 얻기위한 파일; 나는 속성 파일에서 하나의 속성 값을 얻는 것뿐입니다. 하지만 하드 코딩 된 문자열을 사용하여 속성에 액세스해야한다는 점이 마음에 들지 않습니다. 유지 관리 문제 (예 : 하드 코딩 된 문자열의 모든 인스턴스 변경)가 발생할 수 있기 때문입니다.

나의 현재의 접근 방식에서 나의 현재 접근

, 나는 속성에서 키 이름 파일을 나타내는 정적 최종 변수를 생성하는 유틸리티 클래스가 있고, 그때 변수가 프로퍼티 값에 액세스하는 것을 사용

public static final String APP_NAME = "appName"; 
... 
props.getProperty(APP_NAME); 

하지만 과잉 상태 인 것처럼 보이기는하지만 과도한 유지 관리 문제 일 수 있습니다. 키는 이미 특성 파일에 있으며, 유틸리티 클래스에서 다시 키를 선언합니다.

get 메소드를 사용하여 속성 값에 액세스 할 때 내 코드에서 키 이름에 액세스하는 데 "유지 관리가 필요없는"방법이 더 있습니까?

+3

나는 일반적으로 아니오라고 말할 것입니다. 어떤 시점에서 직접 또는 간접적으로 핵심이 무엇인지 알아야합니다. – MadProgrammer

+0

흠, 나는 두려웠습니다. 키 이름에 대한 .properties 파일에 직접 액세스하는 영리한 방법이 있는지 궁금합니다. @MadProgrammer 응답에 감사드립니다. – richsinn

+0

나는 한 곳에서 코드를 수정하기 만하면되므로 현재 접근 방식이 일반적으로 받아 들여지는 수단이라고 생각한다. 변수와 키 사이의 매핑을 생성 할 수 있지만 같은 위치에 다시 있어야합니다. – MadProgrammer

답변

3

아니요, 올바르게 처리하고 있습니다. 실제로 유지 보수가 거의 필요 없습니다. 약간 것이 바람직 할 것입니다 자바 열거 형을 사용하여

- 즉

이유는 당신이 할 경우에도 문자열 상수, 당신은 일정하게 사용하는 모든 코드를 다시 컴파일하지 않고 그것을 변경하지 않을 수 있다는 것입니다
public class PropertiesWrapper { 
    private final Properties props; 
    ... 
    public String get(MyEnum key) { return props.get(key.toString()); 
} 

- 컴파일러 때문에 컴파일 타임에 "appName"으로 상수를 대체합니다.

열거 형을 사용하고 열거 형 상수를 제거하면 코드에서 다시 컴파일해야하지만 실제로 잘못된 것을 묻는 경우에는 문제가되지 않습니다. 또한 name() 대신 toString()을 사용하여 속성 이름을 가져와 열거에서 toString()을 자유롭게 바꿔서 상수 이름과 다른 것을 반환 할 수 있습니다.

열거 형을 사용하는 것의 단점은 Properties에 액세스하기위한 대체 방법없이 컴파일시 알려지지 않은 것을 찾아 볼 수 없다는 것입니다.

1

속성 파일을 읽고 getter가있는 원본 파일로 생성하는 라이브러리가있을 수 있습니다. 그런 다음 해당 소스 파일을 코드로 컴파일해야합니다. 꽤 멋진 도서관이 될 것입니다. 그러나 이것이 존재하지 않는다면, 나는 이것을 할 다른 방법이 없다고 생각합니다. 이 존재하더라도

, 나는 key1Stringkey2Integer입니다 것을 알 수있을 것입니다 표시되지 않습니다. 아직도 어딘가에 던져야 할 것 같습니다. 즉, 별도의 메타 데이터 파일을 유지 관리하면 더 많은 유지 관리로 돌아갑니다.

문제는 언제든지 등록 정보 파일 키를 변경할 수 있고 컴파일러가이를 알지 못한다는 것입니다.

내가 제공 할 수있는 가장 좋은 것은 구성 파일을 읽는 것을위한 라이브러리입니다. 을 확인하십시오.

+0

그래, 나는 컴파일러가 속성 파일 키 변경에 대해 알지 못할 것입니다. 나는이 질문이 개발 중에 더 많은 것 같아요. 즉, 속성 파일 키의 이름을 바꾸고 유지 보수 문제 등을 걱정할 필요가 없다는 것을 깨닫게되었을 때입니다. – richsinn

+0

NetBeans [@Messages ] (http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/NbBundle.Messages.html) 주석은 정확히 그렇게합니다. –

0

동료와 나는 지금 매우 비슷한 문제에 직면하고 있으며,이를 반영하여 해결할 수 있는지 알아보기 위해 연구를 수행했습니다. 불행히도, 우리는 그것을 해결할 수 없었지만, 우리의 문제와 전략을 상세하게하려고 노력할 것입니다. 어쩌면 영리한 사람이 기준선을 사용하여 우리를 되돌려 놓은 한계를 극복 할 수있는 무언가를 만들 수 있습니다.

문제 설명 : 속성 파일에서 값을 읽고이 값을 Java 개체 (설정 개체)의 필드에 할당하려고합니다. 키 이름은 우리에게 중요하지 않으며 단순히 Java 필드의 이름을 키 이름으로 사용하는 것이 가장 좋습니다.

이 두 가지 큰 혜택을 가져올 것입니다 :

  1. 첫째, 우리가 중복 문자열 상수를 많이 제거 할 수있다.
  2. 둘째, 설정 클래스가 상속을 사용하여 구현되므로 한 곳에서 필드 할당을 정의 할 수 있습니다.

리플렉션을 사용하여 모든 인스턴스 필드를 얻는 수퍼 클래스에서 메소드를 정의 할 계획이었습니다. 이후 여기에서, 우리의 전략은 모든 필드를 통해 루프하고 것 :

  1. 이 이름을 필드 얻을, 등록 정보 파일의 등록 정보를 조회 할 수
  2. 사용이 이름,
  3. 이의 종류를 얻을 이 필드를 사용하여 특성 파일에서 읽은 문자열 값을 변환 한 후 나중에 현재 필드에 지정하십시오.

이 방법을 사용하면 새 인스턴스 필드를 추가하기 만하면 새 속성을 추가 할 수 있습니다. 새 속성을 읽고 쓰는 데 필요한 추가 코드가 필요하지 않습니다.

불행하게도이 때문에 두 가지 문제로 실현되지 않습니다 :

  1. 자바 컴파일러는 this answer를 참조 필드 이름에 대한 정보를 제거 할 수 있습니다.
  2. JVM에 따라 Class#getDeclaredFields()을 사용하면 액세스가 거부 될 수 있습니다.