2

重複の可能性:
なぜゲッターとセッターを使用するのですか?

私はこれが非常に些細なことであることを知っています。しかし、なぜプライベートを定義してから、ゲッターとセッターを使用するのでしょうか。これは、プログラマーがプライベート変数またはメソッドの使用を間違えるのを防ぐためのものですか?それともセキュリティ上の理由からですか。セキュリティ上の理由から、ゲッターまたはセッターを持つことのポイントは何ですか?getterとsetterの内部に制限を設けることができることは知っていますが、if句は主に、プライバシーの制限ではなく、間違いを防ぐためのものです。たとえば、これらのメンバーについては、通常、if句を使用してこのメ​​ソッドへのアクセスを制限するとは言いません。

ありがとう。

4

7 に答える 7

11

すべての変数に対して自動的に、無意識のうちgetX()にメソッドを作成するという慣習は悪いことです。あなたが観察したように、それはほとんど無意味です。setX()

しかし、悪いのは考えられない部分です繰り返しになりますが、基になるデータへのアクセス方法を制御できるため、メソッドは公開された変数よりもはるかに優れています。自分が何をしているのかを考え、必要に応じてミューテーターとアクセサーを適用する場合、それらは素晴らしいツールです

  • クライアントを読み取りのみに制限できますが、変数への書き込みは制限できません。
  • 整数の値を正の値のみに制限できます(たとえば)。
  • たとえば、ある変数が常に別の変数の値の半分に等しくなるようにすることができます。
  • 変数の値が変更されるたびに、他のクライアントに通知するイベントが送信されるようにすることができます。
  • 基になる変数のデータ型を変更したり、パブリックメソッドで変換を実行したり、クライアントを壊したりすることはできません。
  • 同じオブジェクトのサーバー側バージョンのオブジェクトをリモートクライアントに変換できます。この場合も、クライアントコードは変更されません。
  • synchronizedアクセサを使用すると、スレッド間で厳密なメモリ順序を確保できます。

これらは、ミューテーターとアクセサーで実行できることのほんの一部です。それらを使用することにより、ソフトウェアの変更と保守が容易になります。

于 2012-07-23T03:05:04.453 に答える
2

クラスの変数をだれでも編集できるようにすると、非常に悪いことが起こる可能性があります。(たとえば、不注意なユーザーが分母をゼロに変更した場合、ユニバースを破壊する可能性があります[またはゼロ除算エラーが発生する可能性があります])。定義get()set()メソッドにより、あなた(プログラマー)は他の人があなたの変数とどのように相互作用できるかを正確に定義することができます。

于 2012-07-23T03:04:48.927 に答える
1

もう1つの利点があります。ゲッターとセッターを使用すると、サブクラスがメソッドと柔軟性を使用して情報にアクセスする方法をオーバーライドできるようになります。

于 2012-07-23T03:21:02.150 に答える
1

プライベートフィールドを使用し、ゲッターとセッターがあるため、これらのプライベートフィールドには他のクラスからアクセスできます。プロジェクトにCar.javaとDriver.javaの2つのクラスがある場合、DriverオブジェクトがCar.javaのプライベートフィールド「wheel」にアクセスできるようにする必要があります(そうでない場合、Driverは車を運転できません)。ただし、フィールドがプライベートの場合は、フィールドの値を返すgetterメソッドを使用してのみアクセスできます。セッターは、外部クラスがフィールドの値を変更できるようにします。フィールドをプライベートではなくパブリック(または適切な場合は保護)にすることで、ゲッターとセッターの使用を回避できます。

于 2012-07-23T03:03:27.977 に答える
1

それはあなたが物事へのアクセスを制御することを可能にします.....データの一部へのアクセスをカプセル化することによって、あなたはそのデータがどこにあるかを自由に変えることができます、あるいはあなたはそれを計算可能にするかもしれません。つまり、フィールドの値を返すのではなく、何らかの計算を行います。

しかし、ゲッターやセッターと同じように、それらを使いすぎると、必要な作業を実行するためのオブジェクトを取得していないことを示します。

于 2012-07-23T03:04:11.100 に答える
1

例を使って、要点を説明しましょう。次のクラスがあるとします。

class User {
    private String username;
    private String password;
}

現在、複数のプログラマーが作業しているチームプロジェクトで。プログラマーAUserはクラスを開発し、プログラマーBはGUIインターフェイスで作業する必要があります。決定されたポリシーでは、passwordフィールドは5文字未満にすることはできません。ただし、データフィールドを作成していない場合を除き、 ABprivateの両方で、フィールドに割り当てられている新しいパスワードの有効性を常に確認する必要があります。password

ここで、それらを作成した後private、次のセッターメソッドを実装するとします。

public boolean setPassword( String temp ) {
    if( temp.length() >= 5 ) {
        this.password = temp;
        return true;
    }
    else {
        return false;
    }
}

このように、Aだけが一度コーディングする必要があり、Bはポリシーを気にせずにそれを使用するだけです。これは常にDRY(自分自身を繰り返さないでください)ルールを奨励します。

于 2012-07-23T03:26:19.073 に答える
1

Setter amd Getterメソッドは、基本的に、他の人による変更を制限するために使用されます。Java言語では、データ非表示の概念を提供しています。これは、getメソッドとsetメソッドによって実現されます。

于 2012-07-23T04:41:53.167 に答える