我有一个通用类,其中包含一个通用列表。我想确保通用列表只包含唯一的类。
到目前为止,我所做的是将类名与反射 (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/

10-14 10:33