Возможно ли переопределить Object#equals(Object)
локально при использовании list.contains(someObject)
?Переопределение объекта # равно (объект) вне класса
Пример:
class SomeObject {
...
private int id;
private String name;
@Overrdide
public boolean equals(Object other){
...
return this.id == other.id;
}
}
Но что, если я хочу другой вид равных, когда я использую list.contains(someObject)
? Например, я хочу знать, содержит ли список определенное имя? Можно ли переопределить Object#equals(Object)
'анонимно'?
Более конкретные объяснения, почему я должен был бы это:
int objectId = ... // Some event which passes me the attribute of an object but not the object itself
Теперь у меня есть List<SomeObject> someObjects
, и я хотел бы знать, если этот список содержит объект с objectId
без необходимости переборе над ним.
Один «решение» я мог придумать бы использовать Map<Integer, SomeObject> mapping
и затем someObject = mapping.get(objectId)
EDIT: Мой вопрос не является дубликатом, так как я специально с просьбой отменить Object#equals(Object)
.
Это должно быть, но это ИМХО, самое плохое в API коллекций. Вы можете использовать пользовательский Компаратор во многих местах, но вы застряли только с одним понятием 'equals'. –
Если у Java были только классы case :-( – SklogW
Использование компаратора для задания действий равенства для ключей Set и for Map (но оно наносит ущерб производительности - операции становятся O (log n), потому что вам нужно использовать TreeMap, а не HashMap). Тем не менее, это не помогает в List List. Должно быть возможно использовать обычное понятие равенства с методами, такими как 'indexOf',' contains' и т. Д., Но это невозможно без создания класса-оболочки и переопределения равных, как вы хотите. –