设置为单个类的实例
问题描述:
我有一个Set
的对象,我不想允许存储任何类的多个实例。哪种解决方案是最好的:设置为单个类的实例
- 检查,如果有一组给定的类的实例(似乎并不高效)
- 实施
hashCode
返回常数和equals
返回o != null && o.getClass() == getClass()
- 化妆自己执行
Set
(几乎像第一个选项) - 其他什么?也许已经有这样一套?
答
我会用它Map<Class<? extends T>, T>
它。
实现示例:
class SingleInstanceSet<T> {
Map<Class<? extends T>, T> map = new HashMap<Class<? extends T>, T>();
public boolean add(T o) {
if (map.containsKey(o.getClass()))
return false;
map.put((Class<? extends T>) o.getClass(), o);
return true;
}
public T get(Class<? extends T> klass) {
return map.get(klass);
}
}
用法示例:
public static void main(String[] args) {
ClassSet<Object> instances = new ClassSet<Object>();
instances.add("hello");
instances.add(1234);
instances.add("will not be added");
System.out.println(instances.map);
}
输出是这样的:
{class java.lang.String=hello, class java.lang.Integer=1234}
+0
谢谢,我会用它:) – 2012-02-15 08:36:10
答
使用HashMap。在添加一个对象之前,获取它的类(使用反射)并检查它是否已经是HashMap中的一个键。
答
你可以
发明
实现小包装类和商店,而不是实例:
public class InstanceWrapper {
private Object obj;
public InstanceWrapper(Object obj) { this.obj = obj; }
public Object getObject() { return obj; }
@Override
public boolean equals(Object other) {
return this.getClass().equals(other.getClass());
}
@Override
public int hashCode() {
return this.getClass().hashCode());
}
}
的平等是通过类实例定义,一组只接受任何类的一个实例。
我不确定你的第二个选项是否有效。难道你不需要实现hashCode并且对于java类层次中的每个类都是相等的。还是只有你想要存储在你的设置中的特定类? – 2012-02-14 14:33:06