Это решение, которое сработало для меня.
class TreeSetWithEquals extends TreeSet {
//Constructors which I will use
//
// I consider two sets equal if they have equal elements in the same order!
@Override
public boolean equals(Object o) {
//Check if Object not null, not the same reference as this, and
// it is instance of Set
//And their sizes are equal
//Iterate through boths sets and apply equals for each method.
}
}
Зачем мне это делать?Ну, в нашем коде мы генерируем равные для других объектов в Idea ->, которая использует Objects.equals(this.field_i, that.field_i)
.Нам лень искать в нашем коде места и заменять Objects.equals(this.field_i, that.field_i)
, если field_i
- отсортированный набор в класс util, чтобы проверить равенство наборов.Поэтому проще использовать набор, который поддерживает сортировку, но использует eqauls
для каждого элемента внутри this.equals
.
Некоторые люди говорят мне, что eqauls
, hashCode
, compareTo
должны быть непротиворечивыми,Я согласен с eqauls
, hashCode
должен быть последовательным.
Например.
enum WeaponType {
KNIFE,
HAND_GUN,
TWO_HANDED_GUN,
GRANADES, //To allow flash, smoke and fragmentation granades
DEFUSE_KIT
}
class Shooter {
// make sure we can have different weapons,
// but only one of type is allowed.
// Our tree set with such comparator will guarantee this requirement.
private SortedSet<Weapon> weapons = buyWeapons(andUseWeaponTypeComparator);
Для этого я определю WeaponComparator
Comparator<Weapon> WEAPON_COMPARATOR = Compareator
.comparing(Weapon::getType, Comparator.naturalOrder()) //enum uses its element order.
}
Теперь, если вы хотите сохранить стрелка иотправлять сообщения в кафке на другие микро-сервисы, у вас будет equals
, который проверяет сущности who Shooter .