我有一个通用类,其中包含一个通用列表。我想确保通用列表只包含唯一的类。
到目前为止,我所做的是将类名与反射 (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 接口(interface)实现。对 java.util.AbstractSet 进行子类化可能是最简单的。
默认情况下,'Set' 将通过 .equals()
方法比较对象 - 在您的情况下,这还不够。您将需要覆盖 contains
方法以确保仅添加唯一类的实例。
在您覆盖的 contains
中,比较类实例而不是它们的字符串化包名称可能相同/更容易
IE。使用 a.getClass() == b.getClass()
,而不是 a.getClass().getName()
关于java - 通用列表中的唯一类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31718509/