문제

저는 상당히 큰 프로젝트를 Java로 작업하고 있습니다.내 질문은 내 응용 프로그램의 속성 집합을 가장 잘 구성하는 방법에 관한 것입니다.

접근법 1:모든 클래스에서 액세스할 수 있는 정적 속성 개체가 있습니다.(단점:그런 다음 일부 클래스는 애플리케이션의 컨텍스트에서 벗어나면 일반성을 잃습니다.또한 다른 클래스에 있고 나중에 사라질 수 있는 일부 정적 개체에 대한 명시적인 호출이 필요합니다.그냥 그렇지 않아 느끼다 응, 내가 틀렸어?)

접근법 2:기본 클래스에서 속성을 인스턴스화하고 다른 애플리케이션 클래스에 전달하도록 합니다.(단점:거의 모든 클래스에 Properties 개체에 대한 포인터를 전달하게 되므로 매우 중복되고 번거로워지는 것 같습니다.나는 아니에요 좋다 그것.)

어떤 제안이 있으십니까?

도움이 되었습니까?

해결책

나는 많은 속성에 대해 Spring 종속성 주입을 사용하는 것을 좋아합니다.애플리케이션을 빌딩 블록처럼 처리하고 해당 속성이 필요한 구성 요소에 직접 속성을 주입할 수 있습니다.이는 캡슐화를 유지(장려)합니다.그런 다음 구성 요소를 함께 조립하고 "기본 클래스"를 만듭니다.

종속성 주입의 좋은 부작용은 코드를 더 쉽게 테스트할 수 있다는 것입니다.

다른 팁

실제로 접근 2는 정말 잘 작동합니다.

최근 프로젝트에서 싱글 톤 속성 객체를 사용해 보았습니다. 그런 다음 기능을 추가 할 시간이되면 싱글 톤을 수정해야하며 내가 사용한 모든 장소를 찾아야한다는 것을 후회했습니다. MySingleton.getInstance().

다양한 생성자를 통해 글로벌 정보 객체를 전달하는 데 접근 2는 제어하기가 더 쉽습니다.

명시 적 세터를 사용하면 도움이됩니다.

class MyConfig extends Properties {...}

class SomeClass {
    MyConfig theConfig;
    public void setConfi( MyConfig c ) {
        theConfig= c;
    }
    ...
}

잘 작동하며 실제로 구성 정보가 필요한 클래스에 정확하게 제어하게되어 기쁩니다.

많은 클래스에서 속성이 필요한 경우, 접근 1을 사용하거나 모든 정적 메소드 대신 싱글 톤 디자인 패턴을 사용하는 변형 일 것입니다. 이것은 당신이 속성 객체를 계속 통과 할 필요가 없다는 것을 의미합니다. 반면에, 몇 개의 클래스에만 이러한 속성이 필요한 경우, 언급 한 이유로 접근 2를 선택할 수 있습니다. 당신은 또한 당신이 쓰는 클래스가 실제로 재사용 될 가능성이 얼마나 될지 스스로에게 물어볼 수도 있고, 그렇다면, 문제가 얼마나 많은 문제가 속성 객체를 재사용하는 것이 얼마나되는지를 스스로에게 물어볼 수도 있습니다. 재사용이 가능하지 않은 경우 지금은 귀찮게하지 말고 현재 상황에서 가장 간단한 솔루션을 선택하십시오.

구성 관리자 구성 요소가 필요한 것 같습니다. 그것은 일종의 서비스 로케이터를 통해 발견 될 것입니다. ConfigurationManagerClass.instance(). 이것은 모든 재미를 캡슐화 할 것입니다. 또는 Spring과 같은 종속성 주입 프레임 워크를 사용할 수 있습니다.

구성 요소가 아키텍처에서 서로를 찾는 방식에 따라 다릅니다. 다른 구성 요소가 참고 문헌으로 전달되고 있다면 그렇게하십시오. 일관성이 있습니다.

빠른 것을 찾고 있다면 시스템 속성을 사용할 수 있으며 모든 클래스에서 사용할 수 있습니다. 문자열 값을 저장하거나 '물건'목록을 저장 해야하는 경우 System.Properties () 메소드를 사용할 수 있습니다. 이것은 해시 가능 인 '속성'객체를 반환합니다. 그런 다음 원하는 것을 테이블에 보관할 수 있습니다. 예쁘지는 않지만 글로벌 속성을 가질 수있는 빠른 방법입니다. ymmv

나는 보통 공통 프로젝트에있는 싱글 톤 객체를 사용하고 네임 스페이스에 키가 키드 된 해시 가능성을 포함하여 각각의 속성 클래스를 초래합니다.

의존성 주입은 또한 좋은 방법입니다.

메모리 내 특성에 대한 정적 포인터가있을 때 더 편안합니다. 때로는 런타임에서 속성을 다시로드하려고하거나 정적 참조로 구현하기 쉬운 기타 기능을 원합니다.

클래스는 섬이라는 것을 기억하십시오. 재사용 가능한 클래스는 핵심을 참조 할 수있는 클라이언트 클래스를 가질 수 있습니다.

인터페이스를 사용할 수도 있고 과도하게 사용하지 마십시오.

접근 2가 무시 무시합니다.

어쨌든, 다른 클래스가 구성 객체를 통해 검색하지 않아야합니다. 구성 객체에서 촬영 한 구성을 흡수해야합니다.

보세요 Apache Commons 구성 구성에 대한 도움말.

그래서 메인 ()에서 당신은 가질 수 있습니다

MyObject mobj = new MyObject();
mobj.setLookupDelay(appConfig.getMyObjectLookupDelay);
mobj.setTrackerName(appConfig.getMyObjectTrackerName);

대신에

MyObject mobj = new MyObject();
mobj.setConfig(appConfig);

여기서 AppConfig는 구성 파일의 값 이름으로 값 기반의 모든 조회를 수행하는 Apache 구성 라이브러리 주변의 래퍼입니다.

이런 식으로 당신의 물체는 매우 쉽게 테스트 할 수 있습니다.

한동안 Java를하지 않았지만 Java.lang.System 속성에 속성을 넣을 수 없습니까? 이렇게하면 어디에서나 값에 액세스하고 "글로벌"속성 클래스를 피할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top