如何个性化 class 的等值并测试集合中的等值?

How to personalize equals for a class and test equal values in a set?

我必须为我的火车覆盖 equals class,它具有三个属性:数量、货车和类型;只有编号相同的两列火车才相等。我必须测试我的火车 SET 中是否有重复项。我怎样才能做到这一点 ? 这是我到目前为止所做的:

public class Train {
    private int number;
    private String type;
    private int wagons;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public int getWagons() {
        return wagons;
    }

    public void setWagons(int wagons) {
        this.wagons = wagons;
    }

    @Override
    public boolean equals(Object obj) {
        Train otherTrain = (Train) obj;
        boolean equal = false;
        if (otherTrain.getNumber() == this.getNumber()) {
            equal = true;
        }
        return equal;
    }

训练 DAO:

public class TrainsDAO {
    private Set<Train> trainSet = new HashSet<Train>();

    public Set<Train> pupulateTheSet() {
        Random random = new Random();

        for (int i = 1; i < 1000; i++) {
            Train train = new Train();
            train.setNumber(random.nextInt(10));
            train.setWagons(random.nextInt(30));
            train.setType("Inter-city");
            trainSet.add(train);
        }
        return trainSet;
    }

    public static void main(String[] args) {
        TrainsDAO trainsDAO = new TrainsDAO();
        Set<Train> trains = trainsDAO.pupulateTheSet();
        for (Train train : trains) {
            System.out.println(train);
        }
    }
}

和测试:

public class TrainTest extends TestCase {

    private TrainsDAO trainsDAO = new TrainsDAO();
    private Set<Train> trainSet = trainsDAO.pupulateTheSet();
    public TrainTest(String name) {
        super(name);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    @Test
    public void testIfThereAreEqualValuesInSet() {
        assertTrue(!duplicateFound());
    }

    private boolean duplicateFound() {
        //check if there are duplicates in the set return true if there are no false otherwise
        return false;
    }
}

您现在实施的 equals 覆盖可能会抛出:

  • NullPointerException 如果参数是 null
  • ClassCastException 因为在将 Object 参数转换为 Train
  • 之前没有 instanceof 检查

您可能想要解决这个问题。

更重要的是,对于基于散列的集合,您需要 @Override Object#hashCode 方法与 equals 一致(即,根据您的列车编号返回散列码) .

正确覆盖 hashCode 将确保您的 Train 在数字不同时将被放入不同的哈希桶中。

另请注意:让单元测试检查 Set 中的重复值似乎毫无意义 - Set 的全部意义在于它 而不是 允许重复。

文档here