web-dev-qa-db-ja.com

setおよびgetメソッドとパブリック変数の利点

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

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

たとえば、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;
    }

}

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

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

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

  1. ゲッターとセッター検証が可能、フィールドはできません
  2. ゲッターを使用すると、目的のクラスのget subclassを実行できます。
  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; }

[〜#〜] edit [〜#〜]:Eclipseを使用している場合、新たな利点が1つあります-フィールドにウォッチポイントを作成できますが、setterがある場合はブレークポイントだけが必要です。 。ブレークポイント(セッターメソッド内など)は条件付きにすることができ、ウォッチポイント(フィールド上)はできません。そのため、x=10セッター内のブレークポイントでのみ実行できます。

76
dantuch

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

例えば:

 public class A{

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

   }

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

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

例えば:

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;
       }

ポリモーフィックの例:サブタイプのオブジェクト参照変数を、呼び出しメソッドからの引数として、呼び出されたメソッドのスーパークラスパラメーターのオブジェクト参照変数に割り当てることができます。

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");

             }
         }
      }
8
  1. 一部のライブラリは、「Java Bean標準」を満たすためにこれを必要とします。
  2. セッター/ゲッターはインターフェイスに配置できますが、プロパティはインターフェイスに配置できません
  3. セッター/ゲッターは、下位​​クラスで簡単にオーバーライドできます。
  4. セッター/ゲッターは、値がオンデマンドで計算されるのか、プロパティへの単なるアクセサーであるのか、情報を抽象化します
4
yankee

物事をやや後方に見る方法。

メンバー変数を公開することでクラスの内部動作を公開するほうがよい状況はありますか?そのため、その消費者はデザイナーが思いもよらないことをすることができ、失敗のeast宴とクラッシュの宝庫につながりますか?

答えの種類自体は本当にそうではないのですか?

オブジェクト指向の基本原則、カプセル化。パブリックメンバ変数は、基本的にプレフィックスを持つグローバル変数です...

1
Tony Hopkinson