我分配了一个创建名为Trio的对象,该对象可以包含实现可比的三个对象。这是标题:
public class Trio<T extends Comparable<? super T>> implements Comparable<Trio<T>>
在编写equals方法时,我必须确定两个Trios是否以任意顺序包含三个相同的逻辑等效对象,它们在逻辑上是否等效。
现在,我知道我可以将每个对象中的三个对象放入两个不同的列表中,对列表进行排序,然后逐项进行比较,但是我决定将逻辑嵌套为if
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;
}
此代码是否在良好实践中?对我来说似乎有些俗气,但是除了上面描述的方法之外,我想不出一种更优雅的方式来做到这一点。