間違っていることが判明した、最も長く保持されていたプログラミングの仮定は何ですか? 質問、間違った仮定の 1 つは次のとおりです。
そのプライベート メンバー変数は、クラスではなくインスタンスに対してプライベートでした。
(リンク)
私は彼が話していることを聞き取れませんでした.誰かが例を挙げてそれについて間違っている/正しいことを説明できますか?
間違っていることが判明した、最も長く保持されていたプログラミングの仮定は何ですか? 質問、間違った仮定の 1 つは次のとおりです。
そのプライベート メンバー変数は、クラスではなくインスタンスに対してプライベートでした。
(リンク)
私は彼が話していることを聞き取れませんでした.誰かが例を挙げてそれについて間違っている/正しいことを説明できますか?
public class Example {
private int a;
public int getOtherA(Example other) {
return other.a;
}
}
このような。ご覧のとおり、private はインスタンス メンバーが別のインスタンスからアクセスされるのを防ぎません。
ところで、少し気をつけていれば、これは悪いことばかりではありません。上記の例のように private が機能しない場合、equals() などのメソッドを記述するのは面倒です。
これは、他のオブジェクトのプライベートフィールドにアクセスできない場合のMichaelBorgwardtの回答に相当します。
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return other.valueEquals(this.value); // <------------
}
@Override // This method would probably also be declared in an interface
public boolean valueEquals(int oValue) {
return this.value == oValue;
}
}
今日、これはRubyプログラマーにはおなじみですが、私はしばらくの間Javaでこれを行っています。別のオブジェクトのプライベートフィールドへのアクセスに依存したくない。他のオブジェクトはサブクラスに属している可能性があることに注意してください。サブクラスは、値を別のオブジェクトフィールド、またはファイルやデータベースなどに格納できます。
コード例 (Java):
public class MutableInteger {
private int value;
// Lots of stuff goes here
public boolean equals(Object o) {
if(!(o instanceof MutableInteger)){ return false; }
MutableInteger other = (MutableInteger) o;
return this.value == other.value; // <------------
}
}
「プライベートメンバー変数はインスタンスに対してプライベートである」という仮定が正しければ、マークされた行はコンパイラエラーを引き起こします。これは、フィールドがプライベートであり、メソッドが呼び出されているother.value
オブジェクトとは異なるオブジェクトの一部であるためです。equals()
しかし、Java (および可視性の概念を持つ他のほとんどの言語) では、 private
可視性はクラスごとであるため、フィールドへのアクセスは、MutableInteger
呼び出しに使用されたインスタンスに関係なく、 のすべてのコードに許可されます。