4

Java でクラス メソッドからクラス属性にアクセスする最良の方法について、私はいつも疑問に思っています。

以下の 3 つのソリューション (またはまったく別のソリューション:P) のどれが適切な方法であるかについて、すぐに納得していただけますか?

public class Test {

    String a;


    public String getA(){
        return this.a;
    }

    public setA(String a){
        this.a = a;
    }

    // Using Getter
    public void display(){

        // Solution 1
        System.out.println(this.a);

        // Solution 2
        System.out.println(getA());

        // Solution 3
        System.out.println(this.getA());
    }


    // Using Setter
    public void myMethod(String b, String c){

        // Solution 1
        this.a = b + c;

        // Solution 2
        setA(b + c);

        // Solution 3
        this.setA(b + c);
    }
}
4

7 に答える 7

4

それは、ゲッターとセッターが何をしているかに完全に依存します。値を取得して設定するだけではない場合(メソッドのJavadocに明示的に文書化する必要があります)、クラス内から選択する方法に実際に違いが生じます。しかし、それらがゲッター/セッターのような純粋なJavabeanである場合は、スコープ内にその名前のローカル変数があるかどうかに応じてa、変数に直接アクセスしたいと思います。this.a

個人的には、Javabeanの仕様に従ってゲッターとセッターを「純粋」に保ち、値の取得/設定以外のことをしたいときはいつでも、自己記述型のメソッド名を持つ別のゲッターまたはセッターを追加します。例:getAndIncrement()、、getAsString()などsetAsInt(String)

好みの問題。コーディング全体で一貫している限り、実際に害を及ぼすことはありません。

于 2010-04-20T21:37:05.097 に答える
2

将来、検証を作成する必要がある場合は、セッター/ゲッターが必要になります。変数を表示すると、クラスのカプセル化にブレーキがかかります。理論的には、コードがオブジェクト指向:Pではないことを意味しますが、実際には、多くのコードリファクタリングを実行する機能が失われます。たとえば、インターフェイスを抽出します。そして、この呼び出しについては、冗長だと思いますが、それは私だけです:)

于 2010-04-20T21:33:23.360 に答える
0

this.valueを返すだけのロジックが含まれている場合は、クラスでゲッターとセッターを使用します。このようにして、重複を避けます。例:

...
public List<String> getList() {

    if (this.list == null) {
        this.list = new LinkedList<String>();
    }

return this.list;

}

public int getListSize() {
    return getList().size();
}
...

他の人が私のコードを読みやすくするため、私は常に「これ」を使用します。this.valueがクラス属性であるのは間違いありませんが、valueはローカル変数とクラス属性の両方である可能性があります。

于 2010-04-20T21:35:19.423 に答える
-1

ソリューション 2 または 3 は、フィールドにカプセル化を提供するため、ベスト プラクティスです。たとえば、フィールド'a'がユーザーの郵便番号で、アプリケーションに郵便番号を常に大文字で返すという新しい要件があるとします。ソリューション 2 または 3 を使用すると、これは簡単になります。例えば

private String postcode;
public String getPostcode()
{
   return postcode;
}

になる

private String postcode;
public String getPostcode()
{
   return postcode != null? postcode.toUppercase() : null;
}

フィールドにアクセスする場所ではなく、1 か所だけを変更することになります。の追加は、this純粋にあなた自身の個人的なスタイルやプロジェクトの基準次第です。個人的には、不要で読みやすさの邪魔になるので好きではありませんが、他の人にとっては、メソッド/フィールドの所有者がより明確になります。

于 2010-04-20T21:40:22.357 に答える
-1

使うsetA(b + c)のはばかげています。

ゲッターとセッターはインターフェースの一部です。メソッドはすでに状態へのフル アクセスを持っています。率直に言ってください。

不変式を壊すのではないかと心配しているなら、あなたのクラスはあなたには複雑すぎます。(それを認めてリファクタリングしてください。)

于 2010-04-20T22:20:44.300 に答える
-2

私は一緒に行きます

System.out.println(getA());

setA(b + c);

属性へのアクセス方法を一般的に変更したり、変数を設定できる対象に制約を適用したりする場合は、getAメソッドまたはsetAメソッドを変更するだけでよいという単純な理由からです。

同じ名前の変数を明示的に区別する必要がない限り、これを使用するのは好きではありません。

于 2010-04-20T21:34:11.167 に答える
-2

ゲッターとセッターを使用する方法です。

  • それは一般的に受け入れられている慣習です

そのため、他のプログラマーがあなたのコードを理解する可能性が高くなります。

  • クラス作成者に将来のオプションを提供します

誰かが a を null に設定するのを防ぎたいとします。メンバーを公開すると、それはできなくなります。

使用するかどうかについては、一貫しthisて使用thisして、インスタンスメンバーであり、いつでもローカル変数であることを他の人に非常に明確にするようにしています-偶発的なシャドウイングを回避するのにも役立ちますが、これはそれほど重要ではなく、スタイルの問題だと思います.

また、-this.aはインスタンス メンバー (インスタンスごとに 1 つ) であり、クラス メンバー (クラスごとに 1 つ、静的) ではありません。this明確にするために使用する別の理由。

于 2010-04-20T21:28:12.813 に答える