2013-08-29 60 views
5

我们在属性文件中有一些数据。这些数据在许多类中使用。所以,我们在每个类中创建一个Properties类对象,然后使用getProperty()方法读取数据。这导致代码重复。如何避免多次读取属性文件

有人可以请建议一些最佳实践,以避免这种情况吗?即来到我的脑海

的一件事是:
创建一个类
有属性文件每个属性公共变量在这个类
有值分配给每个属性
在该方法需要属性值的类,为这个类创建一个对象并访问公共变量

但是,我不喜欢这种方法的东西是公共变量,并且如果新属性被添加到属性文件中,我需要添加代码来读取该类中的属性。

任何帮助表示赞赏。

谢谢!

+1

怎么样'Singleton'方法的 –

+0

的可能重复[让您在各种类可用的Java属性?](http://stackoverflow.com/questions/4750131/make-java-properties-available-across-classes) –

回答

0

您可以使用具有静态属性对象的专用类来执行此操作。一个例子见here

0

我可能误解你的数据流在这里,但这是什么,似乎“正常”的对我说:

  • 创建readPropFile方法。
    • 这应该读取文件并适当地解析它找到的属性。
    • 这些属性可以存储在Map<String, Object>中,按属性名称散列。
  • 读取属性文件一次(大概在应用程序启动,或在适当的时机来加载属性) - >Properties对象(比如,props)。
  • 通过props围绕任何需要访问这些属性。
    • 或者,如果您不想明确地传递它,请使用如图所示的静态访问器here
  • 使用props.get("PROPERTY_NAME")(它只是在内部Map中查找该属性)访问属性。
    • 如果您不想使用字符串查找,可以在某处保留有效属性名称的枚举,并使用该名称进行存储/查找,但是每次添加新属性时必须更新该枚举到文件。
+0

谢谢,这也是有用的 – Austin

17

您可以创建一个Singleton类,加载它第一次被调用的属性..和一个公共的方法,检索属性值,对于给定的属性键。

这是假设你正在使用一个标准的属性文件...但你可以推断这到任何键值对,改变属性类型到一个地图或其他东西。

喜欢的东西

public class PropertyHandler{ 

    private static PropertyHandler instance = null; 

    private Properties props = null; 

    private PropertyHandler(){ 
     // Here you could read the file into props object 
     this.props = ..... 
    } 

    public static synchronized PropertyHandler getInstance(){ 
     if (instance == null) 
      instance = new PropertyHandler(); 
     return instance; 
    } 

    public String getValue(String propKey){ 
     return this.props.getProperty(propKey); 
    } 
} 

然后你就可以调用此为需要的..从任何代码..这样。

String myValue = PropertyHandler.getInstance().getValue(propKey); 

希望这有助于

+1

如果PropertyHandler将从多个线程中使用,那么应该同步getInstance。 –

+0

你是对的......修正了......(我在飞行中写了这个..我忘了......) –

+0

是的,这有帮助。非常感谢你。此外,感谢所有其他人的回应。 – Austin

0

我已经使用枚举成功,并在使用该名称()方法构造函数读取相同名称的属性。一定要以合理的方式处理异常,否则整个班级将无法加载,并且您不会收到有用的错误消息。

这种方法的好处是每个枚举值自动对应一个属性,而不必为每个属性编写单独的映射代码。你当然需要每个属性的枚举值(如果你想要DRY prop引用,这是不可避免的),但是你避免使用未经检查的字符串重复每个属性的初始化代码。

缺点是枚举不允许泛型类型,所以如果你想要某些属性返回Integer和其他属性来返回String,那么你可能会更好地使用经典的单例类设计。

如果你想为此疯狂,你也可以编写一个脚本来从属性文件中生成你的Enum或者singleton java源代码,以保持代码额外的干爽。

2

对我来说,静态内部类是最好的方式来做到这一点。它会懒散地做到这一点,因为类加载是同步的,所以线程安全,还有性能。因此,我们正在实现三件事:

  1. 良好的表现,因为与同步生动性会受到影响,但这里我们使用静态内部类。
  2. 线程安全,因为当内部类将被加载比只有地图将被初始化为类加载是线程安全的,因此所有总线程安全。
  3. 当我们调用Singleton.initialize().get(key)时,内部类将被加载,因此地图会被懒惰地初始化。

下面是代码...

public class SingletonFactory 
{ 
    private static class Singleton 
    { 
     private static final Map<String, String> map = new HashMap<String, String>(); 
     static 
     { 
      try 
      { 
       //here we can read properties files 
       map.put("KEY", "VALUE"); 
      } 
      catch(Exception e) 
      { 
       //we can do the exception handling 
       System.out.println(e); 
      } 
     } 
     private static Map<String, String> initialize() 
     { 
      return map; 
     } 
    } 

    public static String getValue(String key) 
    { 
     return Singleton.initialize().get(key); 
    } 
}