2016-11-03 24 views
1

在Java Web应用程序中,我有几个具有静态方法的类,这些类需要某些属性文件中存储的凭据。在静态块中设置属性文件值与上下文参数

我想知道的优选的方法是什么,用于检索在属性文件中的值:

  1. 静块 - 具有其中从属性文件中读取,并设置适当的凭据作为类的类一个static块变量。
  2. 上下文参数 - 从ContextListener中的属性文件读取,并在上下文参数中设置值。

(1)是,我不必在每次我打电话给他们时间,这是多余的凭据传递到静态方法的优点。

(1)的缺点是我正在多次读取同一个属性文件。

(优点/缺点反转情况下(2))

+0

为什么(1)需要读取文件不止一次? – Thilo

+0

我有几个这样的文件...我想我可以使它成为一个公共变量。这是你的建议吗? – theyuv

+0

如果你的配置值需要在整个应用程序中从很多类访问,那么是的,一个快速的方法是将它们作为公共获取者或字段提供。 – Thilo

回答

0

静块:一个代码块“{}”仅运行一个时间,它是第一次运行的构造或主该类()方法被调用(周日称此“上课的时候被初始化”)Reference.

“我在读从同一属性文件多次。”。为什么和如何?

+0

回复:“为什么和如何”:因为我有几个这样的文件需要使用属性文件中的值 – theyuv

1

虽然通常可以避免使用Singleton模式,但您可以在此处使用它来访问各处的属性。它也将有唯一不变的状态,所以我觉得它是确定在这里使用一个单身:

public final class MyProperties { 
    private final Properties properties; 

    private MyProperties(){ 
     properties = new Properties(); 
     properties.load(...); // Load your properties here and maybe do some checks 
    } 

    public static final MyProperties INSTANCE = new MyProperties(); 

    // Or add some fields/getters instead 
    public String getProp(String key){ 
     return properties.getProperty(key); 
    } 
} 

请注意,这里的实例在启动时创建的,但你也可以懒洋洋地创造它首先需要时。这样做的好处是,如果无法找到属性文件,您将在启动时收到通知。

此外,您可以扩展此检查是否包含某些必需的属性,否则抛出一个错误,并为属性提供一些getter。

另外,您也可以只具有被初始化在那样的静态初始化公共静态字段:

public final class MyProperties { 
    public static final String USERNAME; 
    // More fields   

    static { 
     // Load your properties here and set the fields accordingly 
    } 

    private MyProperties() {} 
}