确保不同的构造函数在Java中具有相同的行为

确保不同的构造函数在Java中具有相同的行为,java,constructor,Java,Constructor,上周我参加了一次面试,编程测试中的一个问题是:如何确保类中的不同构造函数在Java中具有相同的行为?。我过去没有,现在仍然不确定,同样的行为意味着什么。我的回答是: (new MyObject(...)).equals(new MyObject(...)); (new MyObject(...)).hashCode == (new MyObject(...)).hashCode(); 这里,在每一行中,第一个MyObject。。。引用一个构造函数,第二个引用另一个

上周我参加了一次面试,编程测试中的一个问题是:如何确保类中的不同构造函数在Java中具有相同的行为?。我过去没有,现在仍然不确定,同样的行为意味着什么。我的回答是:

    

    (new MyObject(...)).equals(new MyObject(...));
    (new MyObject(...)).hashCode == (new MyObject(...)).hashCode();

这里,在每一行中,第一个MyObject。。。引用一个构造函数,第二个引用另一个构造函数


你认为这些问题实际上是在问什么?

这取决于你如何定义equals和hashcode

比如说最差的!考虑以下的等式:

还有哈希代码


现在,对象的状态是什么都不重要了

这取决于如何定义equals和hashcode

比如说最差的!考虑以下的等式:

还有哈希代码


现在,对象的状态是什么都不重要了 我认为正确的解决方案是使用一个主构造函数,并通过调用此函数将所有其他构造函数委托给它。。。。如果所有非主构造函数都尽可能短,那么它们的行为可能都是相同的,因为它们都委托给相同的代码


当然,单元测试也可能是正确的答案。

< P>我不会认为你的答案是正确的。您只是在证明两个对象是相等的。顺便说一句,如果对象相等,它们必须具有相同的哈希代码,第二次比较是多余的

我认为正确的解决方案是使用一个主构造函数,并通过调用此函数将所有其他构造函数委托给它。。。。如果所有非主构造函数都尽可能短,那么它们的行为可能都是相同的,因为它们都委托给相同的代码


当然:单元测试也可能是正确的答案。

我认为它与this和super的使用有关。

我认为它与this和super的使用有关。

如果您引用的类没有覆盖给定的方法,那么equals仍然是false,因为它们是两个不同的对象,所以它们的内存分配细节是不同的。哈希代码也不起作用

我认为您可以编写一段代码,使用反射遍历类,并检查每个字段是否具有相同的值。最后,这两个实例的不同之处在于字段而不是方法,因为它们是在编译时设置的


祝你下次面试好运。

如果你引用的类没有覆盖给定的方法,那么仍然等于将为false,因为它们是两个不同的对象,它们的内存分配细节是不同的。哈希代码也不起作用

我认为您可以编写一段代码,使用反射遍历类,并检查每个字段是否具有相同的值。最后,这两个实例的不同之处在于字段而不是方法,因为它们是在编译时设置的


祝你下次面试好运。

非常感谢你的回答。但更确切地说,你说的同样的行为是什么意思?@Alex:面试官说的同样的行为是什么意思?我只能猜测,在我看来,这意味着-有一致的行为,这可以在他们都委托给同一个构造函数时得到证明。嗯,就是这样,我在测试中得到了这个问题,而不是在面试中,所以没有人问这意味着什么,即使是在之后。在你的解释中有一点对我来说没有意义:当然,所有非主构造函数都可以委托给主构造函数,但之后它们也可以做其他事情,否则它们都将是一行,只调用super。。。使用适当的参数。那么他们怎么会有相同的行为呢?@Alex:他们不会完全有相同的行为,但大部分人会。您有一个主构造函数提供公共逻辑/行为,其他构造函数添加次要功能设置额外字段,预解析。显然,如果所有构造函数都有完全相同的行为,那么为什么会有呢?但是,如果主构造函数接受int并进行大量处理,而另一个构造函数接受String并在委托给int版本之前对其进行解析,那么它们仍然具有相同的行为。好吧,这很有意义:再次感谢您,您帮了我很大的忙!非常感谢你的回答。但更确切地说,你说的同样的行为是什么意思?@Alex:面试官说的同样的行为是什么意思?我只能猜测,在我看来,这意味着-有一致的行为,这可以在他们都委托给同一个构造函数时得到证明。嗯,就是这样,我在测试中得到了这个问题,而不是在面试中,所以没有人问这意味着什么,即使是在之后。有一点
在你的解释中,有一件事对我来说没有意义:当然,所有非主构造函数都可以委托给主构造函数,但之后它们也可以做其他事情,否则它们都将是一行,只调用super。。。使用适当的参数。那么他们怎么会有相同的行为呢?@Alex:他们不会完全有相同的行为,但大部分人会。您有一个主构造函数提供公共逻辑/行为,其他构造函数添加次要功能设置额外字段,预解析。显然,如果所有构造函数都有完全相同的行为,那么为什么会有呢?但是,如果主构造函数接受int并进行大量处理,而另一个构造函数接受String并在委托给int版本之前对其进行解析,那么它们仍然具有相同的行为。好吧,这很有意义:再次感谢您,您帮了我很大的忙!谢谢你的回答。但是,在这种情况下,您将如何使用super?如果您有多个构造函数,您可以使用不同的参数调用它,但最终您可能需要在其中一个构造函数中调用super implicit或Explicit,并将其余构造函数链接起来以获得答案。但是,在这种情况下,您将如何使用super?如果您有多个构造函数,您可以使用不同的参数调用它,但最终您可能只需要在其中一个构造函数中调用super implicit或Explicit,并将其余构造函数chainedYes,您是对的。当我写下我的答案时,我确实意识到了这一点,但我就是搞不懂以同样的方式行事意味着什么。谢谢你指出。是的,你是对的。当我写下我的答案时,我确实意识到了这一点,但我就是搞不懂以同样的方式行事意味着什么。不过,谢谢你指出。肯定有人会在像我那样使用它之前覆盖equals。肯定有人会在像我那样使用它之前覆盖equals。
return true;
return 1;