Я плохо разбираюсь в Kotlin, но эта проблема звучит точно так же в Java. В Java у вас есть два типа равенства: (1) ссылочное равенство (a == b), где a и b являются ссылками на один и тот же объект, и (2) hashCode / равно равенству. Я подозреваю, что когда вы говорите об «уникальности», вы имеете в виду не ссылочное равенство, а скорее понятие равенства хеш / равно, когда все поля одинаковы.
То, что у вас есть, не является языковой проблемой. Это проблема дизайна. Вам нужно решить, что делает два объекта равными ИЛИ выбрать другой подход.
Итак, один из способов сделать это - определить такой метод, как:
enum Similarity { FULL, NAME }
boolean same(Object object, Similarity similarity)
Затем вы можете вызвать то же самое ( ) из equals (), чтобы придать сходство по умолчанию. Вы также можете представить себе, как сделать объект модальным, в котором он имеет состояние подобия, а метод equals использует это состояние, чтобы решить, какой тип подобия использовать. Обратной стороной этого состояния является (1) проблема подобия / равенства не обязательно лучше всего определяется методами в самом классе (разделение проблем) и (2) изменяемое состояние не лучшее, если вы можете его избежать.
Другой, возможно, лучший подход может заключаться в создании двух реализаций компаратора, в которых один компаратор использует только имя, а другой - все значения. Это очень распространенный подход в Java и должен быть таким же простым в Kotlin. Компараторы задают порядок сортировки, но возвращаемое значение 0 указывает на равенство. Если вы предпочитаете логическое значение, вы можете использовать тот же метод, но создать интерфейс, например:
interface SimilarityComparator
{
boolean same(Object a, Object b)
}
BTW, если вы реализуете компаратор как вложенный класс, вы можете увеличить инкапсуляцию, избавившись от необходимости раскрывать свойство значения или поля для сравнения (методы получения и установки свойств плохие, см. Алан Холуб).
https://www.baeldung.com/java-comparator-comparable
Надеюсь, это поможет.
Jon