在下面的代码中,构造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);
    }
}

最佳答案

这似乎是一种键值对缓存设计,但不是线程安全的。

为什么用两套代替Map?

您可以使用单例持有人和哈希表制作线程安全的单例

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类的责任
此存储区应在新的PropertyValue实例之后(或之前)填充,但不能在构造函数中填充。

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

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

09-27 20:28