У меня есть задание для создания объекта под названием Trio, который может содержать три объекта, которые реализуют сопоставимые. Вот заголовок:
public class Trio<T extends Comparable<? super T>> implements Comparable<Trio<T>>
При написании метода равенства я должен определить, являются ли два трио логически эквивалентными, если они содержат три одинаковых логически эквивалентных объекта в любом порядке.
Теперь я знаю, что мог бы поместить три объекта из каждого в два разных списка, отсортировать списки, а затем сравнить их по терминам, но я решил выписать логику как вложенную, если это
В 4 слоях имеется 15 if
операторов.
Этот код входит в цикл for
только тогда, когда ему абсолютно необходимо провести дополнительную проверку на предмет большего количества элементов:
@Override
public boolean equals(Object other) {
if (other instanceof Trio<?>) {
Trio<?> otherTrio = (Trio<?>) other;
// Is there really a best practice for this? I feel like this
// is most efficient since it creates no new objects
if (!this.getItem(1).equals(otherTrio.getItem(1))) {
if (!this.getItem(1).equals(otherTrio.getItem(2))) {
if (!this.getItem(1).equals(otherTrio.getItem(3))) {
return false;
}
if (this.getItem(2).equals(otherTrio.getItem(1))) {
if (this.getItem(2).equals(otherTrio.getItem(2))) {
return false;
}
if (this.getItem(3).equals(otherTrio.getItem(1))) {
return false;
}
return true;
}
if (this.getItem(3).equals(otherTrio.getItem(2))) {
return false;
}
return true;
}
if (this.getItem(2).equals(otherTrio.getItem(3))) {
if (this.getItem(2).equals(otherTrio.getItem(1))) {
return false;
}
if (this.getItem(3).equals(otherTrio.getItem(3))) {
return false;
}
return true;
}
if (this.getItem(3).equals(otherTrio.getItem(1))) {
return false;
}
return true;
}
if (!this.getItem(2).equals(otherTrio.getItem(2))) {
if (!this.getItem(2).equals(otherTrio.getItem(3))) {
return false;
}
if (!this.getItem(3).equals(otherTrio.getItem(2))){
return false;
}
return true;
}
if (!this.getItem(3).equals(otherTrio.getItem(3))) {
return false;
}
return true;
} else
return false;
}
Является ли этот код хорошей практикой? Это кажется мне липким, но я не мог придумать более элегантного способа сделать это, кроме моего метода, который я описал выше.