68

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

変数をパブリックにする代わりに、クラス内のプライベート変数にアクセスするメソッドを作成することに利点はありますか?

たとえば、2番目のケースは最初のケースよりも優れていますか?

//Case 1
public class Shoe{
    public int size;
}

//Case 2
public class Shoe{
    private int size;
    public int getSize(){
        return size;
    }

    public void setSize(int sz){
        size = sz;
    }

}
4

4 に答える 4

101

いつかSOで見たもの、答え(@ ChssPly76によって書かれた)として、ゲッターとセッターを使用する理由

セッターが値を設定する以上のことを行う必要があることに気付いた今から2週間(月、年)なので、プロパティが他の238のクラスで直接使用されていることにも気付くでしょう:-)

さらに多くの利点があります。

  1. ゲッターとセッターには検証を含めることができますが、フィールドには検証を含めることができません
  2. getterを使用すると、必要なクラスのサブクラスを取得できます。
  3. ゲッターとセッターはポリモーフィックですが、フィールドはポリモーフィックではありません
  4. ブレークポイントは、特定のフィールドの多くの参照の近くではなく、1つのメソッド内に配置できるため、デバッグははるかに簡単になります。
  5. 実装の変更を隠すことができます:

前:

private boolean alive = true;

public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }

後:

private int hp; // change!

public boolean isAlive() { return hp > 0; } // old signature 
 //method looks the same, no change in client code
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; }

編集:Eclipseを使用している場合のもう1つの新しい利点-フィールドにウォッチポイントを作成できますが、セッターがある場合はブレークポイントだけが必要です...ブレークポイント(セッターメソッドなど)は条件付きで、ウォッチポイント(フィールド上)できませんx=10したがって、セッター内のブレークポイントでのみ停止できる場合にのみデバッガーを停止したい場合。

于 2012-06-17T12:52:08.817 に答える
11

パブリック変数を使用すると、入力値をチェックできないため、変数に誤った値が設定される可能性があります。

例えば:

 public class A{

    public int x;   // Value can be directly assigned to x without checking.

   }

セッターを使用すると、入力をチェックして変数を設定できます。インスタンスをプライベートに保ち、ゲッターとセッターをパブリックに保つことはカプセル化ゲッターの形式であり、セッターはJavaBeans標準 とも互換性があります。

ゲッターとセッターは、ポリモーフィズムの概念の実装にも役立ちます

例えば:

public class A{

     private int x;      //


      public void setX(int x){

       if (x>0){                     // Checking of Value
        this.x = x;
       }

       else{

           System.out.println("Input invalid");

         }
     }

      public int getX(){

          return this.x;
       }

多態的な例:サブタイプのオブジェクト参照変数を、Callingメソッドからの引数として、Calledメソッドのスーパークラスパラメーターのオブジェクト参照変数に割り当てることができます。

public class Animal{

       public void setSound(Animal a) {

          if (a instanceof Dog) {         // Checking animal type

                System.out.println("Bark");

             }

         else if (a instanceof Cat) {     // Checking animal type

                 System.out.println("Meowww");

             }
         }
      }
于 2012-06-17T12:56:51.903 に答える
6
  1. 一部のライブラリでは、「JavaBean標準」を満たすためにこれが必要です。
  2. セッター/ゲッターはインターフェースに含めることができますが、プロパティはインターフェースに含めることはできません
  3. セッター/ゲッターは、子孫クラスで簡単にオーバーライドできます。
  4. セッター/ゲッターは、値がオンデマンドで計算されるか、プロパティへの単なるアクセサーであるかにかかわらず、情報を抽象化します
于 2012-06-17T12:55:57.540 に答える
3

物事の見方をやや逆行させます。

メンバー変数を公開することでクラスの内部動作を公開する方がよい状況はありますか?そのため、そのコンシューマーは、デザイナーが思いもよらなかったことを実行でき、失敗の饗宴と墜落の宝庫につながりますか?

ある種の答え自体は本当にそうではありませんか?

オブジェクト指向の基礎となる原則、カプセル化。パブリックメンバー変数は、基本的にプレフィックスが付いたグローバル変数です。

于 2012-06-17T13:27:35.187 に答える