Java에서 애플리케이션 구성 속성 관리

남자

일부 구성 파일이 필요한 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);
    }

}

어쨌든,이 문제를 해결하기위한 표준 해결책이 없습니까?

제이슨 c

실제로 요구 사항에 따라 다릅니다. 여기에는 수많은 옵션이 있습니다. 간단한 응용 프로그램의 경우 일반적으로 임의의 구성 키를 값에 매핑하는 것을 사용합니다. 그런 다음 키 이름을 문자열 상수로 지정할 수 있습니다. 예를 들면 다음과 같습니다.

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";
}

상황을 더 잘 나타내는 경우에만 패키지 이름을 지정하는 것이 더 합리적입니다.

위의 아이디어는 다른 구성 체계에도 적용됩니다. 예를 들어 PreferencesAPI를 사용하면 키 경로가 패키지 이름에서 파생 될 수 있습니다. 그 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Flutter 애플리케이션에서 관리 시스템 생성

분류에서Dev

IBM Worklight-애플리케이션에서 서버 구성?

분류에서Dev

Razor Pages 애플리케이션에서 로거 구성

분류에서Dev

angularjs의 애플리케이션 구성에 서비스 전달

분류에서Dev

기본값이있는 Java의 애플리케이션 구성

분류에서Dev

애플리케이션 관리 지속성이있는 quarkus

분류에서Dev

애플리케이션에 이메일 접근성 구현

분류에서Dev

Spring Security 애플리케이션의 뷰에 속성 전달

분류에서Dev

웹 애플리케이션에 대한 Maven 종속성

분류에서Dev

Node.js 애플리케이션을위한 서버 구성

분류에서Dev

WCF 애플리케이션 용 서버 구성

분류에서Dev

Ember 애플리케이션 빌드 후 구성 관리

분류에서Dev

애플리케이션에서 관리자 지속성을 유지할 수 있습니까?

분류에서Dev

애플리케이션 구조 생성

분류에서Dev

PHP 애플리케이션 구성

분류에서Dev

Azure Functions 앱에서 애플리케이션 별 구성 속성을 저장할 위치

분류에서Dev

Xcode없이 macOS에서 종속성이있는 애플리케이션 개발

분류에서Dev

Android 애플리케이션에서 데이터 레이어 구성

분류에서Dev

JEE 애플리케이션의 yaml 파일에서 맵 속성 삽입

분류에서Dev

Appfog의 Rails 애플리케이션에서 Gemfile 종속성 문제

분류에서Dev

자바 웹 애플리케이션에서 속성 파일 읽기

분류에서Dev

Cloud Foundry에서 애플리케이션의 외부 속성 정의

분류에서Dev

Apache 서버에서 zend 애플리케이션을 구성하는 방법

분류에서Dev

Quartz 작업에서 grails 애플리케이션 구성에 액세스

분류에서Dev

웹 애플리케이션 devops에 대한 샘플 Docker 구성 설정

분류에서Dev

대기 애플리케이션에서 활성 애플리케이션으로 데이터 보내기

분류에서Dev

애플리케이션 전체에서 모든 구성 파일 가져 오기

분류에서Dev

iOS 애플리케이션에서 XMPP Facebook 채팅을 구성하는 방법

분류에서Dev

extjs 애플리케이션에서 Extensible을 구성하는 방법

Related 관련 기사

  1. 1

    Flutter 애플리케이션에서 관리 시스템 생성

  2. 2

    IBM Worklight-애플리케이션에서 서버 구성?

  3. 3

    Razor Pages 애플리케이션에서 로거 구성

  4. 4

    angularjs의 애플리케이션 구성에 서비스 전달

  5. 5

    기본값이있는 Java의 애플리케이션 구성

  6. 6

    애플리케이션 관리 지속성이있는 quarkus

  7. 7

    애플리케이션에 이메일 접근성 구현

  8. 8

    Spring Security 애플리케이션의 뷰에 속성 전달

  9. 9

    웹 애플리케이션에 대한 Maven 종속성

  10. 10

    Node.js 애플리케이션을위한 서버 구성

  11. 11

    WCF 애플리케이션 용 서버 구성

  12. 12

    Ember 애플리케이션 빌드 후 구성 관리

  13. 13

    애플리케이션에서 관리자 지속성을 유지할 수 있습니까?

  14. 14

    애플리케이션 구조 생성

  15. 15

    PHP 애플리케이션 구성

  16. 16

    Azure Functions 앱에서 애플리케이션 별 구성 속성을 저장할 위치

  17. 17

    Xcode없이 macOS에서 종속성이있는 애플리케이션 개발

  18. 18

    Android 애플리케이션에서 데이터 레이어 구성

  19. 19

    JEE 애플리케이션의 yaml 파일에서 맵 속성 삽입

  20. 20

    Appfog의 Rails 애플리케이션에서 Gemfile 종속성 문제

  21. 21

    자바 웹 애플리케이션에서 속성 파일 읽기

  22. 22

    Cloud Foundry에서 애플리케이션의 외부 속성 정의

  23. 23

    Apache 서버에서 zend 애플리케이션을 구성하는 방법

  24. 24

    Quartz 작업에서 grails 애플리케이션 구성에 액세스

  25. 25

    웹 애플리케이션 devops에 대한 샘플 Docker 구성 설정

  26. 26

    대기 애플리케이션에서 활성 애플리케이션으로 데이터 보내기

  27. 27

    애플리케이션 전체에서 모든 구성 파일 가져 오기

  28. 28

    iOS 애플리케이션에서 XMPP Facebook 채팅을 구성하는 방법

  29. 29

    extjs 애플리케이션에서 Extensible을 구성하는 방법

뜨겁다태그

보관