为单个类实例设置

Ada*_*ała 1 java

我有一个Set对象,我不想允许在那里存储任何类的多个实例.哪种解决方案最好:

  • 检查集合中是否存在给定类的实例(似乎效率不高)
  • 实现hashCode返回常量并equals返回o != null && o.getClass() == getClass()
  • 自己实现Set(几乎像第一个选项)
  • 还要别的吗?也许已经有这样一套?

dac*_*cwe 5

我会用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出类似于:

{class java.lang.String=hello, class java.lang.Integer=1234}
Run Code Online (Sandbox Code Playgroud)