Предположим, у меня есть класс без полей, но несколько методов. Например, класс, который только реализующий interface
:Что такое подходящая реализация equals() для класса без полей?
public class SomeClass implements SomeInterface
{
@Override
public void someMethod(int param) {...}
@Override
public int getSomeValue(OtherClass param) {return ...;}
}
Теперь я хочу, чтобы переопределить equals()
для этого. Могу ли я всегда возвращать true
, утверждая, что «поскольку объекты не имеют какого-либо состояния, они всегда равны»?
Реализация так:
@Override
public boolean equals(Object other)
{
if (null == other || !(other instanceof SomeClass))
return false;
return true;
}
Edit: Поскольку некоторые люди спрашивали о намерении за этим, я собираюсь более подробно рассказать о контексте, в котором возник этот вопрос:
Этот класс является слушателем событий. Я создаю экземпляр и передаю его в качестве слушателя к асинхронному запросу вместе с некоторыми другими данными, инкапсулированными в Object с именем Config
.
Другими словами, у меня есть класс с именем Config
, который состоит из SomeClass
и некоторых других данных.
public class Config
{
SomeClass someClass;
int otherData;
//...
@Override
public boolean equals(Object other) {/*???*/}
}
На самом деле я хотел бы реализовать equals
для этого Config
класса (Потому что я хочу, чтобы предотвратить повторные запросы). Но так как одна часть Config
- это пример SomeClass
Мне было интересно, что с этим делать.
Боковой вопрос: Если SomeClass
является вложенным классом и имеют неявную ссылку на его ограждающей класса, что делать тогда? (В моем контексте это так.)
Зачем переопределять 'equals' вообще для такого класса? Вероятно, вы не собираетесь хранить экземпляры этого класса в наборе или в ключах карты, не так ли? – Eran
Я бы сказал, что они равны тогда и только тогда, когда они одного класса, например. если бы у меня был класс ClassClass Extends SomeClass' и переопределить некоторые методы, они не должны быть равны. –
Обычно я защищаю противоположное (чтобы избежать статических методов), но если класс имеет ** никакие поля ** вообще; то мне интересно, почему вам нужно будет создавать экземпляры этого класса в первую очередь. – GhostCat