2013-02-14 2 views
4

이것은 결론적인 대답을 찾을 수없는 쉬운 질문입니다.Properties 대신 ResourceBundle을 사용하지 않는 이유는 무엇입니까?

config.properties 파일에서 문자열 속성 (예 : 준비된 명령문에 대한 검색어)을로드 할 수 있습니다. 연결할 데이터베이스 연결을 가져 가고 싶다고 가정 해 봅시다.

I 파일에서이 정보를 가지고 싶은 경우에, 나는 수업 시간에 다음 바로 할 수있는 :

private static final ResourceBundle BUNDLE = ResourceBundle.getBundle("scheduler"); 
    private static final String DRIVER = BUNDLE.getString("bd.driver"); 
    private static final String CONNECTIONURL =BUNDLE.getString("bd.url"); 
.... 

을하지만 그 대신 나는 많은 사람들이 대신 속성을 사용하는 것이 좋습니다 것을 본 적이 그럼 난 것 (내가 정적 클래스를 유지하고 적절한 생성자를 가지고 있지하려는 경우)이 같은과 동일한 기능을 수행 할 : 두 번째 인 경우

static { 
     prop = new Properties(); 
     try {    prop.load(ReportsDB.class.getClassLoader().getResourceAsStream("config.properties")); 
     } catch (IOException ex) { 
      Logger.getLogger(ReportsDB.class.getName()).log(Level.SEVERE, null, ex); 
      throw new RuntimeException(ex); 
     } 
    } 

    private static final String DRIVER = prop.getProperty("bd.driver"); 
    private static final String CONNECTIONURL = prop.getProperty("bd.url"); 

을 그럼, 왜 나는 ResourceBundle 대신 Properties의를 사용하지 말아야합니다 더 자세한?

답변

8

두 번째가 장황 할 때 Properties 대신 ResourceBundle을 사용하면 안되는 이유는 무엇입니까?

왜냐하면 그게 ResourceBundle이 아니기 때문입니다. description of the class은 다음으로 시작합니다.

리소스 번들에는 로캘 별 개체가 포함되어 있습니다. 예를 들어 프로그램에 로켈 별 리소스 인 String이 필요한 경우 프로그램은 현재 사용자의 로켈에 적합한 리소스 번들에서로드 할 수 있습니다. 이런 방식으로, 리소스 번들에있는 로케일 특정 정보의 전부는 아니더라도 대부분을 고립시키는 사용자 로케일과는 독립적 인 프로그램 코드를 작성할 수 있습니다.

유스 케이스와 비슷합니까? 나는 그렇게 생각하지 않는다.

마치 인 것 같습니다. 속성 파일을로드하는 자세한 방법은 다음과 같습니다. 이렇게 유틸리티 메소드를 작성하십시오. 그런 다음 코드는 간단하게 될 수 있습니다

private static final Properties CONFIGURATION = PropertyUtil.load("scheduler.properties"); 
private static final String DRIVER = CONFIGURATION.getString("bd.driver"); 
private static final String CONNECTIONURL = CONFIGURATION.getString("bd.url"); 

인정 하듯이 내가 그런 순서에 의존하는 방법으로 정적 필드 이니셜을 가진 예리한 아니에요 ... 나는 별도의 구성을 모두 캡슐화 유혹 할 것 클래스, 그래서 당신은 쓸 수 :

private static final SchedulerConfiguration CONFIG = 
    SchedulerConfiguration.load("scheduler.properties"); 

다음 CONFIG.getDriver() 등의 속성에서 각 시간을 가져, 또는 필드, 또는 무엇이든을 사용할 수있는 사용합니다.

+0

쉬운하지만 덕분에. 내가 수업의 의도 된 목적을 알고 있지만, 그것이 당신의 요구 사항을 충족한다면 왜 그것을 사용하지 않습니까? 느린가? 실패 할 수있는 국경 사건이 있습니까?어쩌면 무의미하지만 다른 이유가 있는지 정말로 알고 싶습니다. –

+3

@ChristianVielma : 코드를 * 한 것처럼 보이게 만들 때, 실제로 다른 것을하려고 할 때입니다. * 적어도 * 이것을 한 곳에서 숨기고 왜하는지에 대해 문서화하십시오 -하지만 이상적으로는 클래스를 사용하여 의도 된대로 사용하면 놀라움이 줄어 듭니다. (귀하의 코드를 읽는 것처럼). –

0

구체적인 차이점은 ResourceBundle.getBundle("scheduler")이 클래스 경로 (예 : src 패키지 폴더)에서 파일을 검색한다는 것입니다. 외부 파일에서 ResourceBundle.getBundle("myfile")으로 전화하면 MissingResourceException이됩니다.

당신이 속성 클래스를 사용할 수있는 외부 파일 (예를 들어, 프로젝트 루트에있는 파일)를 사용하려는 경우 : 설명

Properties configuration = new Properties(); 
try (InputStream input = new FileInputStream("configuration.properties")) { 
     configuration.load(input); 
     System.out.println("Configuration value: " + configuration.getProperty("key")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
관련 문제