设置为单个类的实例

问题描述:

我有一个Set的对象,我不想允许存储任何类的多个实例。哪种解决方案是最好的:设置为单个类的实例

  • 检查,如果有一组给定的类的实例(似乎并不高效)
  • 实施hashCode返回常数和equals返回o != null && o.getClass() == getClass()
  • 化妆自己执行Set(几乎像第一个选项)
  • 其他什么?也许已经有这样一套?
+0

我不确定你的第二个选项是否有效。难道你不需要实现hashCode并且对于java类层次中的每个类都是相等的。还是只有你想要存储在你的设置中的特定类? – 2012-02-14 14:33:06

我会用它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()); 
    } 
} 

的平等是通过类实例定义,一组只接受任何类的一个实例。

番石榴提供ClassToInstanceMap,它已经过安全检查,测试等。它就像一个Map<Class<T>, T>,但它已经处理所有类型的系统。