上周我正在接受采访,编程测试中的一个问题是:"如何确保类中的不同构造函数在Java中具有相同的行为?"。我不是,仍然不确定"有相同的行为"手段。我给出的答案是:
(new MyObject(...)).equals(new MyObject(...));
(new MyObject(...)).hashCode == (new MyObject(...)).hashCode();
这里,在每一行中,第一个MyObject(...)引用一个构造函数,第二个引用另一个构造函数。
您认为这些问题实际上是在考虑什么?
答案 0 :(得分:4)
我不认为你的答案是正确的。您只是证明两个对象是相等的(顺便说一下,如果对象相等,它们必须具有相同的hashCode()
,第二个比较是多余的。)
我认为正确的解决方案是拥有一个主构造函数,并通过调用this(...)
将所有其他构造函数委托给它。如果所有非主要构造函数尽可能短,那么它们都可能以相同的方式运行,因为它们都委托给相同的代码。
当然:单元测试也可能是正确答案。
答案 1 :(得分:1)
我认为这与使用this()
和super()
。
答案 2 :(得分:0)
这取决于你如何定义equals和hashcode
例如(最差的一个!)考虑equals()
return true;
和hashcode()
return 1;
现在它并不重要对象的状态!
答案 3 :(得分:0)
如果你引用的类没有覆盖给定的方法,那么仍然等于false,因为它们是两个不同的对象(它们的内存分配细节不同)。哈希码也不起作用。
我认为您可以编写一段使用反射遍历类的代码,并检查每个字段是否具有相同的值。最后,这两个实例仅因字段而不同(因为它们是在编译时设置的,所以不是方法)。
Goodluck接下来的采访。