일부 구성 파일이 필요한 Java 응용 프로그램을 개발 중이지만 항상 속성 이름을 잊어 버리고 모든 구성 속성에 대해 get 메서드를 만드는 것이 불편하다는 것을 알았습니다. 그러나 나는 그들이 제공하는 반환 유형에 유용하다고 생각합니다.
잘 설계된 Java 앱에서 구성이 어떻게 관리되는지 궁금하지만 이와 같은 열거 형을 사용하여 수행하는 것이 좋은 방법인지 알고 싶습니다. 지역화 파일이 있으면 얼마나 복잡해 질지 상상합니다. 하지만이 아이디어는 여전히 나를 유혹하고 있습니다.
public enum Confs {
HLENGTH("hlength", Integer.class),
;
private String propertyName;
private Class type;
private Confs(String propertyName, Class type) {
this.propertyName = propertyName;
this.type = type;
}
public Object getVal(){
// This hash map is loaded in a singleton class which uses java Properties feature to read the configuration file
return MyLoadedConfigurationsSingleTon.getMap().get(this.propertyName);
}
}
어쨌든,이 문제를 해결하기위한 표준 해결책이 없습니까?
키
실제로 요구 사항에 따라 다릅니다. 여기에는 수많은 옵션이 있습니다. 간단한 응용 프로그램의 경우 일반적으로 임의의 구성 키를 값에 매핑하는 것을 사용합니다. 그런 다음 키 이름을 문자열 상수로 지정할 수 있습니다. 예를 들면 다음과 같습니다.
public static final String KEY_COLOR = "color";
public static final String KEY_SIZE = "size";
물론 이것은 이러한 상수 를 어디에 지정 해야하는지에 대한 문제를 제시합니다 . 전역 적으로 공유되는 위치 (예 : 구성 클래스, 일부 특수 상수 값 클래스 또는 enum
제안한 것과 같은 위치)에서 지정할 수 있습니다. 이렇게하면 모든 키 이름을 한곳에서 볼 수 있으므로 충돌을 쉽게 피할 수 있다는 장점이 있습니다. 그러나 이것은 모듈화를 깨고 모든 클래스가이 키 컬렉션에 종속되도록하는 뚜렷한 주요 단점이 있습니다. 이제 개체를 추가 / 제거 / 이동하려면 전역 키 컬렉션을 수정해야합니다.
또 다른 방법은 구성 키 이름을 실제로 사용하는 클래스 / 패키지에서 문자열 상수로 정의하는 것입니다. 이것은 모듈성을 깨뜨리지 않습니다. 그러나 이제는 관련없는 다른 클래스와 키 이름이 충돌 할 위험이 있습니다. 새 키를 추가하면 구성을 사용하는 모든 개체를 살펴보고 새 키 이름이 이미 사용 중이 아닌지 확인해야합니다.
그러나 이에 대한 기존의 Java 솔루션은 키 이름을 사용하는 클래스의 패키지 (및 가능한 클래스 이름)도 포함하도록하는 것입니다. 예 :
package com.me.whatever;
public class Something {
static final String KEY_COLOR = "com.me.whatever.Something.color";
static final String KEY_SIZE = "com.me.whatever.Something.size";
}
package com.me.util;
public class Other {
static final String KEY_SIZE = "com.me.util.Other.size";
static final String KEY_GROUP = "com.me.util.Other.group";
}
상황을 더 잘 나타내는 경우에만 패키지 이름을 지정하는 것이 더 합리적입니다.
위의 아이디어는 다른 구성 체계에도 적용됩니다. 예를 들어 Preferences
API를 사용하면 키 경로가 패키지 이름에서 파생 될 수 있습니다. 그 API는 systemNodeForPackage()
당신을 위해 이것을 처리하는 것과 같은 것들을 제공 합니다.
따라서 가장 명확하고 유지 관리가 쉬운 코드로 이어지는 모든 작업을 수행하십시오. 단순성, 모듈성 및 유연성 간의 균형을 찾으십시오. 간단한 일회용 응용 프로그램의 경우 수행중인 작업이 명확하다면 "OOP"개념을 깨고 모두 한곳에 집어 넣는 데 아무런 문제가 없습니다. 그렇지 않으면 주로 사용되는 키 값을 저장하고 패키지 및 클래스 이름을 활용하여 고유성을 보장하고 키 네임 스페이스 오염을 방지합니다.
가 있습니다 enum
키 이름이 여러 패키지 사이의 분할이있는 경우 반드시에 키 이름을 저장하기에 가장 적절하거나 편리한 데이터 유형이 될 수 없습니다. 당신은 확실히 그 일을 할 수있는 영리한 시스템을 생각해 낼 수 있지만, 문자열 상수는 적절하고 다루기 쉽습니다. 그러나 enum
키 (예 : 값 유형) 이상을 저장하는 경우에는 적절한 솔루션이 될 수 있습니다.
값 유형
그런데 값 유형에 관해서도 많은 옵션이 있습니다. 변환은 구성 측면에서 적용하는 대신 클라이언트 클래스에서 수행 할 수 있지만 물론 후자는 많은 경우에 매우 편리합니다.
를 사용할 때의 문제 enum
는 기본적으로 모든 구성 키를 한곳에서 정의하고 (위 참조) 클래스가 추가되거나 제거 될 때 사용 가능한 구성 키 집합을 모듈 방식으로 확장하기가 어렵다는 것입니다.
fixed를 사용하는 대신 필요에 따라 인스턴스화 할 수있는 범용 구성 키 클래스를 만들 수 있습니다 enum
. 예 :
public class Conf {
public static class Key {
final String key;
final Class<?> type;
public Key (String key, Class<?> type) {
this.key = key;
this.type = type;
}
}
public Object getValue (Key key) {
...
}
}
위의 내용은 제네릭 유형을 사용하여 쉽게 개선 할 수 있습니다.
그런 다음 클라이언트 클래스에서 :
package com.me.whatever;
public class Something {
static final Conf.Key KEY_COLOR = new Conf.Key("com.me.whatever.Something.color", Color.class);
static final Conf.Key KEY_SIZE = new Conf.Key("com.me.whatever.Something.size", Integer.class);
}
키 이름을 다시 말하면 : 선언하는 클래스의 유형을 매개 변수로 취하고 패키지 이름을 추출하여 패키지 이름 접두사 추가를의 함수 로 만들 수도 있습니다. 작동 방식 Conf.Key
과 유사 Preferences.systemNodeForPackage()
하게, 위 선언은 다음과 같습니다.
static final Conf.Key KEY_COLOR = new Conf.Key(Something.class, "color", Color.class);
결론
내가 말했듯이 무한한 옵션이 있기 때문에 나는 많은 것을 비웃고있다. 여기에서 모든 옵션의 모든 경우를 다룰 수는 없지만 아이디어를 얻을 수 있기를 바랍니다. 그것은에 접근에 대해 더 제정신의 방법이 아닌 하나의 특정 "올바른"방식으로 접근.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다