我有一个带有通用列表的通用类。我想确保通用列表仅包含唯一的类。
到目前为止,我所做的是将类名与反射(getClass())进行比较。但是我认为这不是一个干净的解决方案。有什么更好的做法可以检查吗?
public class MyGenericClass<T extends MyGenericClass.MyInterface> {
private List<T> members = new ArrayList<>(0);
public void add(T t) {
final boolean[] classInMembers = {false};
members.forEach(member -> {
if (member.getClass().getName().equals(t.getClass().getName())) {
classInMembers[0] = true;
}
});
if (!classInMembers[0]) {
members.add(t);
}
}
public interface MyInterface {
void doSomething(String text);
}
}
public class Main {
public static void main(String[] args) {
MyGenericClass<MyGenericClass.MyInterface> myGenericClass = new MyGenericClass<>();
myGenericClass.add(new Performer1());
myGenericClass.add(new Performer2());
myGenericClass.add(new Performer3());
myGenericClass.add(new Performer3()); // should not be inserted!
}
private static class Performer1 implements MyGenericClass.MyInterface {
@Override
public void doSomething(String text) {
text = "Hi, I am performer 1!";
}
}
private static class Performer2 implements MyGenericClass.MyInterface {
@Override
public void doSomething(String text) {
text = "Hi, I am performer 2!";
}
}
private static class Performer3 implements MyGenericClass.MyInterface {
@Override
public void doSomething(String text) {
text = "Hi, I am performer 3!";
}
}
}
您可以继承java.util.Set接口的实现。子类化java.util.AbstractSet可能是最简单的。
默认情况下,“设置”将按对象的.equals()
方法比较对象-在您的情况下,这还不够。您将需要重写该contains
方法,以确保仅添加唯一类的实例。
在您的重写中contains
,比较类实例而不是字符串化的包名称可能是相同/容易的
即使用a.getClass() == b.getClass()
,而不是a.getClass().getName()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句