2

私がいくつかのクラスを持っているとしましょう:

public class A {
    private int val = 0;

    public int getVal() {
        return val;
    }

    public void addFrom(A otherA) {
        this.val += otherA.val;
        if (otherA.val > 0)
            otherA.val = 0;
        else
            otherA = Math.abs(otherA.val);
    }
}

otherAのval変数を使用する代わりにgetterメソッドを使用する必要がありますか?そうする方が良いスタイルですか?

編集:これはクラスの非常に単純化されたバージョンであり、読むのに非常に時間がかかります。しかし、怠惰な初期化が行われている、このクラスにアクセスする他のメソッドがあると仮定します。これがより明確になるようにサンプルメソッドを更新しましたが、私の質問が他のオブジェクトへのアクセスに関係していることは明らかだと思います。変数であり、「これ」ではないものに直接変数アクセスを使用することが偽物であるかどうかを知りたい。

4

4 に答える 4

3

いいえ、絶対に違います。

クラスのメンバー内にいるときは変数を直接使用し、他のすべての状況でゲッターを使用する必要があります(valとにかくプライベートであるためエラーが発生する場合)。

于 2012-11-14T20:33:37.667 に答える
1

public int getVal() is intended to present your gift(variable) within a box to the outside world (encapsulation). Do you give gifts yourself in a box? It's weird, so use the variable as it is.

于 2012-11-14T20:34:55.043 に答える
0

不要なゲッターを追加すると、内部構造が明らかになり、結合が増加する可能性があります。

本当にうまくカプセル化されたクラスにはセッターがなく、できればゲッターもありません。クラスに何らかのデータを要求してからそれを使って何かを計算するのではなく、クラスはそのデータを使って何かを計算し、結果を返す責任を負うべきです。

アクセサーを使用してフィールド変数への直接アクセスを制限することは、パブリック フィールドの使用よりも優先されますが、各フィールドごとにゲッターとセッターを作成するのはやり過ぎです。ただし、状況にもよりますが、ダムデータオブジェクトが必要な場合もあります。アクセサーは、実際に必要なフィールドに追加する必要があります。クラスは、他のクラスによって操作される状態のリポジトリではなく、たまたまその状態を使用するより大きな動作を公開する必要があります。

于 2012-11-14T20:58:02.477 に答える
0

変数を使用できますが、現在のコードはコンパイルされません。おそらく、戻り値は boolean ではなく int になるはずです。

おそらく、あなたの意図は Comparable インターフェースから compareTo メソッドをオーバーライドすることです

于 2012-11-14T20:42:59.270 に答える