在构造函数中使用静态变量是否有意义?

时间:2017-09-19 16:57:09

标签: java

在以下代码中,构造PropertyValue时,将填充两个静态集。这种方式有意义吗?

class PropertyValue{

    String cid;
    String property;
    String value;

    public static Set<String> properties = new HashSet<>();
    public static Set<String> values = new HashSet<>();

    public PropertyValue(String cid, String property, String value) {
        this.cid = cid;
        this.property = property;
        this.value = value;

        properties.add(property);
        values.add(value);
    }
}

4 个答案:

答案 0 :(得分:2)

它似乎是一种键值对缓存设计,但非线程安全。

为什么两套代替地图?

您可以使用单例持有者和Hashtable

制作线程安全单例

https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

import java.util.Hashtable;
import java.util.Map;

public class Properties
{
    private Map<String,String> properties = new Hashtable<>();

    private Properties(){}

    private static class PropertiesHolder{
        private final static Properties instance = new Properties();
    }

    public static Properties getInstance(){
        return PropertiesHolder.instance;
    }

    public void put(String property, String value){
        properties.put(property, value);
    }

    public void get(String property){
        properties.get(property);
    }
}

并使用

    Properties properties = Properties.getInstance();
    properties.put("foo","bar");
    properties.get("foo");

上课

class PropertyValue{

    String cid;
    String property;
    String value;

    public PropertyValue(String cid, String property, String value) {
        this.cid = cid;
        this.property = property;
        this.value = value;

        Properties properties = Properties.getInstance();
        properties.put(property, value);
    }
}

但我认为,不是PropertyValue类负责维护这个关键值&#34; store&#34; 应在新的PropertyValue实例之后(或之前)填充此存储,但不应在构造函数中填充。

https://en.wikipedia.org/wiki/Single_responsibility_principle

如果您不需要按对存储属性和值,或者直接在单例中存储一组PropertyValue,则可以保留两组字符串

答案 1 :(得分:1)

如果你不希望成员的生命与对象的生命联系在一起,那么你应该将成员变量设置为静态的唯一时间。也许你有一个在创建或销毁的对象之间共享的计数器。或者,您可能需要在实例化或创建对象之前保留一个函数。也许你有一个基类,它有一个由子类共享的静态成员。这些是我通常会成员静止的唯一时间。

在你的例子中很难说,因为不知道如何实现类的全部范围,很难判断它是否有意义。

答案 2 :(得分:1)

除了静态Set是否是一个好主意......

代码应放在静态初始化程序中。这可确保在加载类时静态内容已准备就绪。根据类设计,可能永远不会调用构造函数。

static {
    // do the work
}

答案 3 :(得分:1)

就设计而言......

公共字段,在本例中为Set,通常是个坏主意。如果其他类需要访问Set,则应通过静态方法完成。

在类的所有实例使用配置信息的情况下,静态集和映射是有意义的。但是,通常不应允许实例修改内容。正如我在之前的回答中所提到的,应该使用静态初始化程序来加载Set或Map。