ゲッターとセッターはどのように機能しますか?


107

私はphpの世界の出身です。ゲッターとセッターとは何かを説明し、いくつかの例を挙げていただけますか?


@ yegor256私はあなたの犬とボールのアナロジーを理解し、それをサポートさえしますが、「生きている生物」オブジェクトが時折プリミティブな値(IDなど)を格納する場合はどうでしょうか?単純な割り当てを超えて一歩進みたいが、プリミティブ値を処理するためだけに新しいクラスを書きたくない場合はどうでしょうか?
Jacksonkr

回答:


127

これにはチュートリアルは実際には必要ありません。カプセル化について読む

private String myField; //"private" means access to this is restricted

public String getMyField()
{
     //include validation, logic, logging or whatever you like here
    return this.myField;
}
public void setMyField(String value)
{
     //include more logic
     this.myField = value;
}

11
そのため、getterはプライベートフィールドを取得するメソッドにすぎず、setterは新しいフィールドを設定しています。コードによる優れた説明をありがとう
ajsie

1
ゲッターにパラメーターを渡すことができますか?
ajsie

2
noname:いいえ、いいえ。ゲッターは、値を取得する方法ですが、フィールドに含まれる値を公開しません。つまり、それを呼び出しsomeObj.getTime().setHour(5)ても、someObjの内部状態に影響を与えないはずです。また、セッターおよびゲッター(アクセサとミューテーターはその名のとおりの名前)には、非常に厳密なメソッドシグネチャがあり、ゲッターにはパラメーターがありません。一般に、メソッドは1つのことだけを実行する必要があります。
Esko

4
@noname:単純なものに複雑/大きな/抽象的な名前が付けられると、いわゆる「デザインパターン」があります。そして、これは私が考案した再帰的な概念の説明パターンの例です;-)
namespaceform

3
@qed:thisより具体的なスコープを持つものとの競合がない限り、キーワードはオプションです。あなたが与えた例では、作成されたセッターは、フィールド名と一致する名前の単一のパラメーターを持ちます。したがってthis.fieldName = fieldName、は、フィールドに割り当てられているパラメーターではなく、フィールドに割り当てられているパラメーターを区別するために使用されますfieldName = fieldname。ゲッターにはそのような競合はありません。
Paul Creasey、2013年

39

Javaでは、ゲッターとセッターは完全に通常の関数です。それらをゲッターまたはセッターにする唯一のものは慣習です。fooのゲッターはgetFooと呼ばれ、セッターはsetFooと呼ばれます。ブール値の場合、ゲッターはisFooと呼ばれます。また、次の 'name'のゲッターとセッターの例に示すように、特定の宣言が必要です。

class Dummy
{
    private String name;

    public Dummy() {}

    public Dummy(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

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

メンバーを公開する代わりにゲッターとセッターを使用する理由は、インターフェイスを変更せずに実装を変更できるようになるためです。また、リフレクションを使用してオブジェクトを検査する多くのツールとツールキットは、getterとsetterを持つオブジェクトのみを受け入れます。たとえば、JavaBeansには、ゲッターとセッター、およびその他の要件が必要です。


9
それらのコンストラクターに「ボイド」がないはずではありませんか?
Jason Hartley

ここでは実際にはvoidが必要です。あなたはそれを持っていない場合は、あなたが得る:error: invalid method declaration; return type required
ダン

3
ここではボイドは必要ありません
Shashi Kiran

2
@JasonHartley:コンストラクタには戻り値の型がありません。
wassimans

@Mark Byersしたがって、インスタンスを初期化するためにコンストラクターが使用され、特定の属性を変更するためにセッターが使用されます。これは正しいです?
carloswm85

12
class Clock {  
        String time;  

        void setTime (String t) {  
           time = t;  
        }  

        String getTime() {  
           return time;  
        }  
}  


class ClockTestDrive {  
   public static void main (String [] args) {  
   Clock c = new Clock;  

   c.setTime("12345")  
   String tod = c.getTime();  
   System.out.println(time: " + tod);  
 }
}  

プログラムを実行すると、プログラムはメインで開始し、

  1. オブジェクトcが作成されます
  2. 関数setTime()はオブジェクトcによって呼び出されます
  3. 変数timeは、渡された値に設定されます
  4. 関数getTime()はオブジェクトcによって呼び出されます
  5. 時間が返されます
  6. それは渡されtodtod印刷されます

10

ゲッターメソッドとセッターメソッドがなぜ邪悪なのか」もお読みください。

getter / setterメソッドはJavaでは一般的ですが、特にオブジェクト指向(OO)ではありません。実際、それらはコードの保守性を損なう可能性があります。さらに、ゲッターメソッドとセッターメソッドが多数存在することは、プログラムがオブジェクト指向の観点から必ずしも適切に設計されていないことを示しています。

この記事では、getterとsetterを使用すべきでない理由(およびそれらをいつ使用できるか)を説明し、getter / setterの考え方を打ち破るのに役立つ設計方法を提案します。


3

1.最高のゲッター/セッターは賢いです。

以下は、mozillaのjavascriptの例です。

var o = { a:0 } // `o` is now a basic object

Object.defineProperty(o, "b", { 
    get: function () { 
        return this.a + 1; 
    } 
});

console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)

彼らは素晴らしいので、私はこれらの多くを使用しました。私は自分のコーディング+アニメーションを使いこなすときに使用します。たとえばNumber、Webページにその番号を表示するを処理するセッターを作成します。セッターを使用すると、トゥイナーを使用して古い番号を新しい番号にアニメーション化します。最初の数値が0で、10に設定すると、数値が0から10にすばやく反転することがわかります。たとえば、0.5秒です。ユーザーはこれを気に入っており、作成するのは楽しいです。

2. PHPのゲッター/セッター

sofの例

<?php
class MyClass {
  private $firstField;
  private $secondField;

  public function __get($property) {
    if (property_exists($this, $property)) {
      return $this->$property;
    }
  }

  public function __set($property, $value) {
    if (property_exists($this, $property)) {
      $this->$property = $value;
    }

    return $this;
  }
}
?>

引用:


2

以下は、Javaでゲッターとセッターを使用する最も簡単な方法を説明する例です。より簡単な方法でこれを行うことができますが、ゲッターとセッターには、継承で子クラスの親クラスのプライベートメンバーを使用する場合に特別なものがあります。ゲッターとセッターを使うことでそれを可能にすることができます。

package stackoverflow;

    public class StackoverFlow 

    {

        private int x;

        public int getX()
        {
            return x;
        }

        public int setX(int x)
        {
          return  this.x = x;
        }
         public void showX()
         {
             System.out.println("value of x  "+x);
         }


        public static void main(String[] args) {

            StackoverFlow sto = new StackoverFlow();
            sto.setX(10);
            sto.getX();
            sto.showX();
        }

    }

私はあなたに反対投票するつもりはありません(努力する価値はありません)。(1)Javaの質問に回答しました。プログラム言語 Javaである必要があります。(2)投稿する場合は、レイアウトが正しく行われていることを確認してください。(3)カプセル化(ゲッター(またはアクセサー)およびセッター(またはミューテーター))の使用が正しくありません。カプセル化の意味を調べてください...(投票された回答を確認してください)
KarelG '18年

1
@KarelG申し訳ありませんが、タグを読みませんでした。私はそれをjavaに更新しました。私を実現してくれてありがとう。
Bashir ahmad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.