サーチ…


前書き

この記事ではゲッタとセッタについて説明します。 Javaクラスのデータへのアクセスを提供する標準的な方法です。

ゲッターとセッターの追加

カプセル化は、OOPの基本概念です。これは、データとコードを単一の単位としてラップすることに関するものです。この場合、変数をprivateとして宣言し、 GettersSettersを介してアクセスして変数を表示および/または変更することをおSettersします。

public class Sample {
  private String  name;
  private int age;

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

これらのプライベート変数は、クラスの外部から直接アクセスすることはできません。したがって、それらは不正アクセスから保護されています。しかし、それらを表示または変更したい場合は、ゲッターとセッターを使用できます。

getXxx()メソッドは変数xxx現在の値を返しますが、 setXxx()を使用して変数xxx値を設定できます。

メソッドの命名規則は次のとおりです(例:variableNameはvariableNameと呼ばれvariableName )。

  • すべての非boolean変数

     getVariableName()   //Getter, The variable name should start with uppercase
     setVariableName(..) //Setter, The variable name should start with uppercase
    
  • boolean変数

      isVariableName()     //Getter, The variable name should start with uppercase
      setVariableName(...) //Setter, The variable name should start with uppercase
    

パブリックゲッターとセッターは、Java Beanのプロパティ定義の一部です。

setterまたはgetterを使用して制約を実装する

セッターとゲッターは、オブジェクトがプライベート変数を含むことを可能にします。プライベート変数は、制限付きでアクセスおよび変更が可能です。例えば、

public class Person {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if(name!=null && name.length()>2)
           this.name = name;
    }
}

このPersonクラスには、 nameという単一の変数があります。この変数にはgetName()メソッドを使用してアクセスし、 setName(String)メソッドを使用して変更できますが、名前を設定するには、新しい名前の長さを2文字以上にする必要があります。変数name publicにするのではなく、setterメソッドを使用することで、他の人が特定の制限を持つnameの値を設定することができます。ゲッターメソッドにも同じことが適用できます。

public String getName(){
   if(name.length()>16)
      return "Name is too large!";
   else
      return name;
}

上記の変更されたgetName()メソッドでは、長さが16以下の場合にのみnameが返されます。そうでない場合は、 "Name is too large"が返されます。これにより、プログラマは、クライアントクラスが望ましくない変数を編集するのを防ぎながら、到達可能で変更可能な変数を作成することができます。

ゲッターとセッターを使う理由

Javaでgetterとsetterを持つオブジェクトを含む基本クラスを考えてみましょう:

public class CountHolder {
  private int count = 0;

  public int getCount() { return count; }
  public void setCount(int c) { count = c; }
}

count変数はプライベートであるためアクセスできません。しかし、 getCount() setCount(int)メソッドとsetCount(int)メソッドは公開されているため、これらのメソッドにアクセスできます。いくつかの人にとって、これは疑問を引き起こすかもしれません。なぜ仲介者を紹介するのですか?なぜ単にそれらを公開するだけではないのですか?

public class CountHolder {
  public int count = 0;
}

すべての目的と目的のために、これらの2つはまったく同じで機能的に同じです。それらの違いは、拡張性です。各クラスの言うことを考えてみましょう:

  • まず、 「私にはint値を与えるメソッドと、その値を別のint設定するメソッドがあります。
  • 第二に、 「私はあなたがintで欲しいものを手に入れることができます。」

これらは同じように聞こえるかもしれませんが、最初のものは実際にはその性質上、もっと守られています。それだけで、それは指示通り、あなたがその内部の自然と対話することができます。これはボールを裁判所に残します。内部的なやりとりがどのように起こるかを選択します。 2番目のメソッドは外部からの内部実装を公開しています。外部のユーザーには負担がかかりませんが、APIの場合はその実装を維持することを約束します(逆方向互換性のないAPIをリリースする)。

カウントの変更とアクセスにアクセスを同期させたい場合は考慮してください。最初は、これは簡単です:

public class CountHolder {
  private int count = 0;

  public synchronized int getCount() { return count; }
  public synchronized void setCount(int c) { count = c; }
}

2番目の例では、 count変数が参照されている各場所を通過したり変更したりすることなく、ほとんど不可能になりました。これは、あなたが他の人によって消費されるように、ライブラリに提供している項目がある場合はさらに悪いことに、あなたはその変更を実行する方法がありませんし、上記のハード選択をすることを余儀なくされています。

だからそれは質問をする。パブリック変数はこれまでずっと良いことです(少なくとも、悪くない)か?

私は不明です。一方では、時間のテスト(IE: System.out参照さout変数)を立てたパブリック変数の例を見ることができます。他方では、公的変数を提供することは、オーバーヘッドを最小限に抑え、言葉遣いを潜在的に減少させること以外には何の利益ももたらさない。ここでの私のガイドラインは、あなたが変数を公開することを計画しているなら、 極度の偏見を持ってこれらの基準に対してそれを判断する必要があります:

  1. この変数は、その実装において常に変化する考えられる理由はないはずです。これは非常に簡単にねじれてしまう(そしてそれが正しいといえども、要件が変わる可能性がある)ので、getters / setterが一般的なアプローチです。パブリック変数を使用する場合は、特にライブラリ/フレームワーク/ APIで公開されている場合は、これを考慮する必要があります。
  2. この変数は頻繁に参照される必要があり、冗長性を減らすことによる最小限の利益はそれを保証します。私は、メソッドを使用するためのオーバーヘッドと直接参照を考えるべきではないと考えています。私が保守的にアプリケーションの99.9%と推定しているものについては、それほど無視できません。

おそらく、私が頭の上から外したとは思っていない以上のことがあります。疑問がある場合は、常にgetters / setterを使用してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow