JAVA更多的类谜题74:同一性的危机
以下程序不完整。它缺少Enigma的声明,这个声明是从java.lang.Object扩展而来的请为Enigma提供一个语句,可以让程序打印出false:
public class conundrum {
public static void main(string[]args){
Enigma e = new Enigma();
system . out . println(e . equals(e));
}
}
哦,还有一件事:你不能重写equals方法。
乍一看,这似乎是不可能的。因为Object.equals方法将测试对象的身份,所以通过Enigma传递给equals方法的对象必须与自身相同。如果不能覆盖Object.equals方法,那么main方法必须打印true,对吗?兄弟,不要这么快就下结论。虽然这个谜题禁止你重写)Object.equals方法,但是你可以重载它,这样就有了下面的解决方案:
final class enigma {
//不要这样!
public Boolean equals(Enigma other){
返回false
}
}
这种说法虽然可以解开这个谜题,但是它的做法真的很糟糕。它违反了难题58的建议:如果同一个方法的两个重载版本都可以应用于某些参数,那么它们应该具有相同的行为。在这个例子中,e.equals(e)和e.equals((Object)e)将返回不同的结果,潜在的混淆显而易见。
不过有一个解决方案不会违背这个建议:
Final Class enigma {
Public enigma(){
system . out . println(false);
system . exit(0);
}
}
可能会有一些争论。这个谜题解法似乎违背了这个谜题的精神:能够产生所需输出的println调用出现在构造函数中,而不是出现在main方法中。然而,它确实解决了这个难题,你不得不承认它很聪明。
关于这里的教训,请参考前面的8个谜题和58个谜题。如果重载一个方法,请确保所有重载版本的行为都相同。
0条评论