17

間違っていることが判明した、最も長く保持されていたプログラミングの仮定は何ですか? 質問、間違った仮定の 1 つは次のとおりです。

そのプライベート メンバー変数は、クラスではなくインスタンスに対してプライベートでした。

(リンク)

私は彼が話していることを聞き取れませんでした.誰かが例を挙げてそれについて間違っている/正しいことを説明できますか?

4

3 に答える 3

35
public class Example {
  private int a;

  public int getOtherA(Example other) {
    return other.a;
  }
}

このような。ご覧のとおり、private はインスタンス メンバーが別のインスタンスからアクセスされるのを防ぎません。

ところで、少し気をつけていれば、これは悪いことばかりではありません。上記の例のように private が機能しない場合、equals() などのメソッドを記述するのは面倒です。

于 2009-08-31T13:37:44.347 に答える
3

これは、他のオブジェクトのプライベートフィールドにアクセスできない場合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でこれを行っています。別のオブジェクトのプライベートフィールドへのアクセスに依存したくない。他のオブジェクトはサブクラスに属している可能性があることに注意してください。サブクラスは、値を別のオブジェクトフィールド、またはファイルやデータベースなどに格納できます。

于 2009-08-31T14:09:27.147 に答える
2

コード例 (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呼び出しに使用されたインスタンスに関係なく、 のすべてのコードに許可されます。

于 2009-08-31T13:42:21.613 に答える