这是在Java中使用实例变量的正确方法吗?

时间:2011-03-15 05:22:03

标签: java map

我有一个类读取配置文件一次,并将所有参数(键/值对)放在Map中。

为了从Map实例中检索值,我创建了一个方法,该方法获取一个键并返回相应的值。 配置映射将传递给需要从配置中读取的所有类。每个使用它的类都会读取它需要的配置参数,并将它们存储在实例变量中,这些变量在类的其余部分中引用。

使用实例变量并将值存储在其中是正确的还是应该在需要获取任何键的值时在配置对象上调用访问器方法?

5 个答案:

答案 0 :(得分:1)

这听起来和我多次做过的一样。您可能还会考虑如何处理配置更改,如果更改,则写回文件。

答案 1 :(得分:1)

首先,您的配置类应考虑使用java.util.Properties进行加载(并在必要时进行保存。)这非常方便。

其次,你正在做的是依赖注入,这是一件好事。您明确指出“此类使用--THESE--配置设置”。 我认为你所做的是对的。

听起来你正在课堂上缓存这些值,而不是从你的配置中查找它们。在以下情况下这很好

  1. 配置不会在运行时更改。 OR
  2. 如果配置已更改,则您不想更改类的实例。
  3. 两个例子:

    void spawnClass() {
       MyProps config = magicConfigurationLoad();
       MyClass a = new MyClass(config); // caches property xyz
       config.setProperty("xyz","bbq"); // change property xyz
       MyClass b = new Class(config); // caches the new value of xyz
    }
    

    无论如何,这就是仅引用get()方法中的实例变量始终使用get()方法的原因,即使在内部方法中也是如此。

    考虑MyClass的内部工作原理

    class MyClass {
    
       static final String IMPORTANT_PROP_KEY = "xyz";
       String myProp;
    
       MyClass(MyProps props) {
           this.myProp = props.get(IMPORTANT_PROP_KEY);
       }
    
       void myFunc() {
           System.out.println("My prop is " + myProp); // bad
       }
    
    }
    

    现在假设您要更改MyClass的实现,以便它引用MyProps实例,以便它可以动态更改(如上所述,#2不适用,您希望随时更改行为

    class MyClass {
        static final String IMPORTANT_PROP_KEY = "xyz";
        MyProps props;
    
        MyClass(MyProps props) {
           this.props = props;
       }
    
       void myFunc() {
           System.out.println("My prop is " + props.get(IMPORTANT_PROP_KEY)); // ugly
       }
    
    }
    

    如果我们让我们的班级使用getter方法,即使它是私有的,那么该课程从一开始会更好。如果您不想要

    ,则不需要公开
    class MyClass {
    
       static final String IMPORTANT_PROP_KEY = "xyz";
       String myProp;
    
       MyClass(MyProps props) {
           this.myProp = props.get(IMPORTANT_PROP_KEY);
       }
    
       void myFunc() {
           System.out.println("My prop is " + getMyProp()); // good
       }
    
       private String getMyProp() {
           return myProp; // good
       }
    
    }
    

    这样当我们将行为更改为不缓存,而是动态更改为props文件时,我们可以这样做:

    class MyClass {
        static final String IMPORTANT_PROP_KEY = "xyz";
        MyProps props;
    
        MyClass(MyProps props) {
           this.props = props;
       }
    
       // this function didn't change
       void myFunc() {
           System.out.println("My prop is " + getMyProp()); // good
       }
    
       private String getMyProp() {
              return props.get(IMPORTANT_PROP_KEY); // good
       }
    
    }
    

    现在被授予,这是一个带有一个实例的小例子。您的大多数课程将有20或30个地方,您必须更改它。这使得重构代码变得更加容易,即使getter是私有的。

答案 2 :(得分:0)

您可以使用静态地图和静态辅助方法。

class SYstemConfiguration{
 private static Map<String,Object> map;

 public static Object getConfiguration(String key){
  /*some other processing*/
  return map.get(key);
 }
}

答案 3 :(得分:0)

老实说,我只是将配置对象/方法设为静态。因此,不是将实例传递给可能需要配置的每个对象,而只需创建类似这样的

public class Configuration{
  private static Map<String, Object> configMap = new HashMap<String, Object>();
  public static Object getValue(String key){
    return configMap.get(key);
  }
}

然后,只要您需要使用它,只需致电

Configuration.getValue(someKey);

这将使以后的生活变得更加容易,因为您不必担心跟踪配置对象的实例。

答案 4 :(得分:0)

我认为你可以使用Singleton设计模式制作Configuration对象。只存在一个Configuration实例,您可以使用此实例获取参数 整个应用程序的价值。我对它进行了调查,发现这个链接可以帮助你http://www.javenue.info/post/40