在以下代码中,构造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);
}
}
答案 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。