9

重複の可能性:
ゲッターとセッターを使用する理由

これは初心者の質問です。getmethods を使用してプロパティ値にアクセスする必要はありますか? 値が割り当てられると、values ディレクトリを取得できます。たとえば、次のコードでdisplayName()は、getter メソッドを使用せずに firstName 値を表示できます。それとも、getter メソッドと setter メソッド、またはその値を与えるその他のメソッドが必要な標準コーディング標準ですか?

class Test{

    private String firstName;

    public void setName(String fname){
        firstName = fname;
    }

    public void displayName() {
        System.out.println("Your name is " + firstName);
    }
}          
4

6 に答える 6

12

教えて、尋ねるな、はオブジェクト指向設計の重要な原則です。通常、オブジェクトに質問するのではなく、何かを行うように指示する必要があります。ゲッター/セッターは、オブジェクトの内部に手を伸ばしてフィールドに到達することをお勧めするため、この慣行を思いとどまらせます (さらに悪いことに、セッターの場合は手を伸ばして物を突き刺します)。これにより、カプセル化が壊れ、コードの推論が難しくなります。

あなたの特定のケースでNameは、それを表示するための名前と単一のメソッドを取るコンストラクターを持つというオブジェクトを作成します。

于 2012-08-09T12:32:17.827 に答える
4

あなたの場合(表示名を表示するために)、Getterを提供する必要はありません。

しかし、別のクラスでフィールドを使用したい場合は、Getter メソッドを提供する必要があります。

于 2012-08-09T12:32:06.767 に答える
3

ゲッターとセッターは Java Beans の標準インターフェースの一部であり、Hibernate のような多くのフレームワークはそれらが適切に配置されることを期待しています。そうは言っても、それらが必要かどうか、いつ、どのような目的で必要かを決定するのはもちろんあなた次第です. これらはプライベート メンバー変数へのアクセスを提供し、単純な get と set 以外のことを行う機会を与えることさえできます。

オブジェクト指向ソフトウェアのポイントは再利用です。これは、他のプログラマー、または何年も後のあなたが、他のシステムのコードを使用できることを意味します。

プライベート メンバー変数があり、get/set 関数を使用すると、それを使用する他のすべてのコードを壊すことなく、関数の内部実装を変更できます。

于 2012-08-09T12:33:03.897 に答える
2

私はこれをサポートするためのリンクを持っていませんが、それは私がしていることです。

パブリックフィールドが静的でない場合は、パブリックフィールドを避けようとします。したがって、保護フィールドとプライベートフィールドを使用します。クラス内から、get/setなしでそれらにアクセスできます。これはまったく問題ありません。クラスの外からは、常にget/setを使用してみてください。

したがって、サンプルコードは私にはまったく問題ありません。:)

編集:私にとっての1つの例外は、このような構造体のようなコンテナクラスを作成する場合です

class Point4D {
  public int x1, x2, x3, x4;
}

それなら、パブリックフィールドは大丈夫だと思います。ただし、それらをプライベートにして、ゲッターなどに名前を付ける方がよいでしょうpublic int x1()インスタンスの状態を変更するいくつかのメソッド(x1 / x2 / x3 / x4の値の変更など)がこのコンテナーに導入されるとすぐに、それらをプライベートにしてget/setを追加します。

于 2012-08-09T12:39:24.043 に答える
2

プロパティにアクセスするには、常に Getter と Setter を使用してください。

この記事を見た方がいい...

于 2012-08-09T12:31:01.457 に答える
2

プライベートな状態を持つため、カプセル化は適切であり、多くの場合、これは正しいことです。あなたのクラスがスレッドセーフであると仮定し、それを保証できないパブリックフィールドがあるとします。

逆にこれがダメな場合もある!1 つのパッケージでのみオブジェクトにアクセスすると仮定すると、それをエクスポートすることはないと確信できます。

于 2012-08-09T12:33:49.800 に答える