2012-03-07 2 views
1

先週のインタビューで、プログラミングテストの質問の1つは「クラス内の異なるコンストラクタがJavaで同じ動作をすることをどのように確認できますか?私はそうではなく、「同じ行動をとっている」ということをまだよく分かっていません。私が与えた答えは:ここ異なるコンストラクタがJavaで同じ動作をすることを保証する

 

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

は、各ラインで、最初MyObjectに(...)は、1つのコンストラクタと他の第2指します。

質問が実際に何を求めていたと思いますか?

答えて

4

あなたの答えは正しいとは思わないでしょう。 2つのオブジェクトが等しいことを証明しているだけです(オブジェクトが等しい場合はに同じである必要があります。hashCode()、第2の比較は冗長です)。

正しい解決策は、プライマリのコンストラクタを1つ持ち、他のすべてのコンストラクタにthis(...)を呼び出すことです。すべての非プライマリコンストラクタができるだけ短い場合、すべて同じコードに委任されるため、すべて同じ方法で動作する可能性があります。

もちろん:単体テストも正しい答えかもしれません。

+0

+1、私はこの非常に同じ答えをタイプしていました。 :) – casablanca

+0

お返事ありがとうございました。しかし、もっと正確には、「同じように行動する」ことは何を意味しますか? – Alex

+0

@Alex:インタビュアーが「*同じ行動をしている」という意味は何ですか?私は、私の意見では、同じコンストラクタにすべて委任したときに証明できる、一貫性のある*振る舞いを持つことを意味するとしか推測できません。 –

0

それはあなたがイコールとインスタンスのハッシュコード

どう定義するかに依存します(最悪のものを!)、それはdoesnの今equals()

return true; 

の次の実装とhashcode()

return 1; 

を考えますオブジェクトの状態が何であるかは関係ありません!

+0

はい、あなたは正しいです。私は自分の答えを書いたときにそれを認識しましたが、「同じように行動する」ことが意味することを理解できませんでした。しかし、それを指摘してくれてありがとう。 – Alex

1

私はそれがthis()super()の使用に関連していたと思います。あなたが与えられたメソッドをオーバーライドしていないために参照するクラスの場合は

+0

あなたの答えをありがとう。しかし、このシナリオではどのようにsuper()を使用しますか? – Alex

+0

コンストラクタが複数ある場合は、 'this()'を異なる引数で呼び出すことができますが、最終的にはおそらくそれらのうちの1つのみで 'super()'(暗黙的または明示的)を呼び出す必要があり、残りは "連鎖"されます – jambriz

0

、そしてまだ彼らは(自分のメモリ割り当ての詳細は異なっている)二つの異なるオブジェクトであるため、falseになります等しいです。ハッシュコードも機能しません。

は、私はあなたがそれが同じ値を持つフィールドごとにリフレクションを使用して、クラス、およびチェックを横断コードの一部を書くことができると思います。結局、2つのインスタンスはフィールドによってのみ異なります(コンパイル時に設定されるためメソッドではありません)。

あなたの次のインタビューでGoodluck。

+0

私はそれを使用する前にequals()をオーバーライドしていました。 – Alex

関連する問題