2009-10-10 16 views
11

私はクラスのためにequals(Object obj)関数を書いています。呼び出し元からobjのプライベートフィールドにアクセスすることが可能であることがわかります。だからではなく、ゲッター使用する:Java:同じクラスの別のインスタンスからプライベートフィールドに直接アクセスする

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

を私は直接フィールドにアクセスすることができます

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

をこの悪い習慣ですか?

+1

正確に重複しているわけではありませんが、非常に近いです:http://stackoverflow.com/questions/1540159/using-getters-or -using-direct-field-a-pojo内でのアクセス – ChssPly76

答えて

6

いいえ、そうではありません。プライベート変数とメソッドが他のクラスからアクセスできない理由は、クラスを使用するすべてのコードを変更することなくクラスの内部を変更できるようにすることです(クラスのユーザーが変数を設定しないようにするそれが決して持っていないと思われる価値に)。

何かを傷つけない他のオブジェクトのプライベート変数を使用する場合は、クラスの内部構造を再構成する場合は、クラス内のコードを変更する必要があります。

+1

時間の99%はうまくいくとはいえ、それは正しいことではありません。カプセル化を解除し、5文字の入力を保存する以外の理由でクラスをより緊密に結合します。私の答えを見てください。 –

+3

"クラスをより緊密に結合する" - どのクラスですか?ここではクラスは1つしかありません。クラスを自分から分離することはできません。 – sepp2k

+1

必ずしもそうではありません。 equals()に渡されるパラメータは必ずしも全く同じクラスではありません。 –

9

私はいつもgetterを使う傾向があります。なぜならgetterは単に "return(foo)"だけではないからです。場合によっては、nullの場合はオブジェクトを初期化したり、デバッグログを取得したり、何らかの方法で現在の状態を検証したりすることがあります。より一貫しています。

+0

+1何らかの理由で「コレクション」をレンタルできる場合より明確な状態にすることを目的としているので、私はゲッターが使用された場所ではなく、1か所でそれを変更したいと考えています。 –

1

これは正常であり、完全に正常です。 thisotherというプライベートフィールドを持つことができると思うのはちょっと奇妙ですが、Odpオブジェクトの内部で何かをすることができる限り、悪いことは起こりません。 OdpクラスのどのメソッドでもOdpオブジェクトのプライベートメンバーを変更することはできますが、thisオブジェクトであっても変更できますが、そのようなメソッドは確実に信頼できるからです。

5

私はこれが悪い習慣だとは思わないが、その言語の特徴です。 equalsのやり方をテストできるだけでなく、オブジェクト作成のプロトタイプパターンでも役に立ちます。

0

プライベートメンバーをエンティティクラスに使用すると、プロキシクラスが正しく動作しなくなる可能性があります。 lazy queryでhibernate create classを想像してみてください。メンバー変数をチェックすると、nullが返されます。 しかし、get()を呼び出すと、データベースからデータを取得してフィールドを初期化します。

1

これは

Why can I access my private variables of the "other" object directly, in my equals(Object o) method

の重複プライベートデータは、クラスAの1つのインスタンスは、それが重要ですA.の別のインスタンスのプライベートメンバーにアクセスしている場合でも、そのクラスのすべてのインスタンスからアクセス可能です(private、protected、public)がインスタンスアクセスではなくクラスアクセスを制御していることを覚えておいてください。

関連する問題