2011-01-20 5 views
7

일부 설정을 사용자 정의하기 위해 특성 파일을 선택했습니다. 나는클래스간에 Java 속성을 사용할 수있게 만드시겠습니까?

Properties defaultProps = new Properties(); 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

내가 모든 클래스에이를 추가해야합니까 클래스의 속성을 만들기 위해 사용할 수있는 다음 코드를 객체를 사용? 아마 모든 클래스가이 파일에 대한 스트림을 열 것이기 때문이 아닙니다. 하지만 제대로 처리하는 방법을 모르겠습니다. 클래스를 MyProperties으로 만들고 클래스에 필요한 속성을 인스턴스화해야합니까?

미리 감사드립니다.

+0

관련 대답 : HTTP : //stackoverflow.com/questions/4362911/how-to-create-a-singleton-class/4363254#4363254 – BalusC

답변

10

defaultProps을 초기화하면 앱의 다른 개체에서 해당 콘텐츠를 사용할 수 있습니다. 공공 정적 접근 방법을 통해, 예를 들면 :

public class Config { 
    private static Properties defaultProps = new Properties(); 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     defaultProps.load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
    public static String getProperty(String key) { 
    return defaultProps.getProperty(key); 
    } 
} 

이 가장 간단한 방법이다가, 그러나 그것은 단위 테스트를 만드는 추가 종속성을 생성 (세게 단위 테스트를위한 모의 속성 객체를 설정하는 Config있는 방법을 제공하지 않는 한).

대안으로는 각 개체에 defaultProps (또는 개별 구성 값)을 주입하는 방법이 있습니다. 그러나 이는 호출 계층 구조가 심하면 많은 메소드에 추가 매개 변수를 추가해야 할 수도 있습니다.

+1

나는이 해결책을 좋아하지 않는다. 메서드를 비 정적으로 만들고 싱글 톤을 만들면 훨씬 유연하고 비용이 들지 않습니다. – maaartinus

+0

@maaartinus : 어떻게 싱글 톤 패턴을보다 유연하게 적용 할 수 있습니까? 추상 팩토리 패턴과 혼동하지 않습니까? – BalusC

+1

@maaartinus, 어떻게 Singleton이 더 유연하게 만들겠습니까? 사실 이것은 이미 인터페이스 뒤에 숨겨져있는 이미 싱글 톤 (모든 고유 종속 객체를 가진 고유 한 전역 객체)입니다. –

0

이 정보를 처리하는 가장 좋은 방법이 무엇인지 판단하기에는 정보가 너무 적습니다. 접근자를 사용하여 접근자를 노출하거나 접근자를 필요로하는 각 클래스에 전달할 수 있습니다. 또는 각 클래스가 필요로하는 속성을 꺼내 값을 클래스의 생성자에 전달할 수 있습니다.

0

다른 클래스가 가져올 수있는 속성을 사용하여 속성을 사용하고 한 번 저장합니다. 그 정적 변수를 어딘가에 참조하는 MyProperties 클래스입니다.

0

이것은 전 세계적으로 사용할 수있는 특별한 경우입니다. 정적 메서드를 사용하는 것은 상당히 나쁩니다. 더 좋지만 좋지 않은 해결책은 sigleton 패턴을 사용하는 것입니다. 테스트가 가장 큰 문제입니다. IMHO, 가장 좋은 방법은 Dependency injection을 사용하는 것입니다. 소규모 응용 프로그램에는 과도한 사용이 될 수 있습니다.

3

속성 클래스 인스턴스가 하나만 필요한 경우 singleton pattern을 사용할 수 있습니다.

그것은이 같은 클래스 같을 것이다 :이 정보는 모든 인스턴스에서 정적

public class MyProperties extends Properties { 
    private static MyProperties instance = null; 

    private MyProperties() { 
    } 

    public static MyProperties getInstance() { 
     if (instance == null) { 
      try { 
       instance = new MyProperties(); 
       FileInputStream in = new FileInputStream("custom.properties"); 
       instance.load(in); 
       in.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
     return instance; 
    } 
} 
+0

"this.load (in);" "instance.load (in)"여야합니다. – icedek

+0

@icedek fixed (내 오래된 답변!) – SirDarius

0

때문에, 나는 singletonProperties 클래스를 구현하는 것이 좋습니다. staticinitialization block 메서드를 사용하면 프로그램을 시작할 때 자동으로 파일을로드 할 수 있습니다.

public class Properties { 
    static { 
    try { 
     FileInputStream in = new FileInputStream("custom.properties"); 
     load(in); 
     in.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    protected static void load(FileInputStream in) { 
    // existing load functionality here 
    } 
} 

여전히 내부 저장 메커니즘과 접근 메커니즘이 필요합니다. 또한 static으로 표시해야합니다.

1

정적 ResourceBundle을 사용하지 않는 이유는 무엇입니까?

static final ResourceBundle myResources = 
      ResourceBundle.getBundle("MyResources", currentLocale); 
0

모든 클래스에 속성을로드하는 것이 아니라 main() 주변에로드하고 생성자를 통해 다른 클래스에 전달합니다.

전 세계에서 공유하지 마십시오. - 어려운 을 테스트 - 추상화에 대해 (글로벌 액세스, DAO는 사용자 설정에 액세스 할 수가 .. 모든 것이가 필요한 것만을 전달하여 방지 할 수 있어야합니다.) - 클래스들이 필요로하는 무슨 거짓말을

관련 문제