Предположим, что у вас есть написанный класс и использовали ленивую инициализацию для назначения одного из своих полей. Предположим, что вычисление для этого поля связано только с другими полями и гарантируется, что каждый раз он будет получать одинаковый результат. Когда два равных экземпляра класса встречаются друг с другом, им разумно делиться значением лениво инициализированного поля (если оно известно). Вы можете сделать это в методе equals()
. Вот класс, показывающий, что я имею в виду.Назначение полей в методе equals()
final class MyClass {
private final int number;
private String string;
MyClass(int number) {
this.number = number;
}
String getString() {
if (string == null) {
string = OtherClass.expensiveCalculation(number);
}
return string;
}
@Override
public boolean equals(Object object) {
if (object == this) { return true; }
if (!(object instanceof MyClass)) { return false; }
MyClass that = (MyClass) object;
if (that.number != number) { return false; }
String thatString = that.string;
if (string == null && thatString != null) {
string = thatString;
} else if (thatString == null && string != null) {
that.string = string;
}
return true;
}
@Override
public int hashCode() { return number; }
}
Для меня это обмен информацией, кажется логичным, чтобы сделать, если вы собираетесь пойти на усилия лениво инициализирует поля, но я никогда не видел пример, кто использует метод equals()
в этом путь.
Это обычная или стандартная техника? Если да, то как это называется? Если это не обычная техника, могу ли я спросить (рискуя поставить вопрос о том, чтобы удержать вопрос в основном на основе мнения), что люди думают об этом? Это хорошая идея использовать метод equals()
для выполнения каких-либо иных действий, кроме проверки равенства?
Если это действительно заставляет ваше приложение работать значительно лучше (при тестировании с реалистичными данными, подобными производственным, так же, как и для производства), подойдите к нему. Но будьте осторожны, чтобы документировать это хорошо, предпочтительно в коде, и убедиться, что есть единичные тесты, охватывающие это поведение во всех отношениях; в противном случае следующий человек после того, как вы будете поддерживать код (или себя через несколько месяцев), будет ненавидеть ваши кишки. –