-2

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

私はしばらくの間コンストラクターを見てきました、私はまだこのようなものがどのように機能するのかわかりません、私はJavaの知識がほとんどなく、それらがゲッターとセッターであることを知っていますが、それはちょうど参照しているように見えるので、それらは私のコードで正確に機能しますコードの特定のブロックを実行しないこと自体に、私は非常に簡単な説明が必要です。議論を求めていません。

public class RSSItem {

    // All <item> node name
    String _title;
    String _link;
    String _description;
    String _pubdate;
    String _guid;

    // constructor
    public RSSItem(){

    }

    // constructor with parameters
    public RSSItem(String title, String link, String description, String pubdate, String guid){
        this._title = title;
        this._link = link;
        this._description = description;
        this._pubdate = pubdate;
        this._guid = guid;
    }

    /**
     * All SET methods
     * */
    public void setTitle(String title){
        this._title = title;
    }

    public void setLink(String link){
        this._link = link;
    }

    public void setDescription(String description){
        this._description = description;
    }

    public void setPubdate(String pubDate){
        this._pubdate = pubDate;
    }


    public void setGuid(String guid){
        this._guid = guid;
    }

    /**
     * All GET methods
     * */
    public String getTitle(){
        return this._title;
    }

    public String getLink(){
        return this._link;
    }

    public String getDescription(){
        return this._description;
    }

    public String getPubdate(){
        return this._pubdate;
    }

    public String getGuid(){
        return this._guid;
    }
}
4

6 に答える 6

2

コンストラクターは、1回のアトミック操作でオブジェクトの初期化を実行しています。コンストラクターを呼び出すと、戻ったときに完全に作成されたオブジェクトが作成されます。これを、単純な引数なしのコンストラクターと、それに続くセッターのチェーンと比較してください。このシナリオでは、オブジェクトを不完全に簡単に作成できます。

一連のセッターではなく、引数を取り、オブジェクトを完全に構築するインテリジェントなコンストラクターを使用する必要がありますか?一般的に、はい。理由は次のとおりです。

  1. 操作はアトミックであり、完全で正しいオブジェクトを提供します(入力を検証すると仮定します)
  2. フィールド、文字列/ストリームなどからオブジェクトを作成するためのオーバーライドを提供できます。
  3. finalフィールドを使用することにより、不変のオブジェクトを作成できます。これは、信頼性(特にスレッドに関して)を判断したり、問題をデバッグしたりするのに非常に役立ちます。

一般的に、私はセッター/ゲッターのセットを貧弱なオブジェクト指向デザインと見なしています。最も基本的には、内部フィールドを公開するだけです。検証などを提供できますが、それでも実装が公開される可能性があります。

コンストラクターを使用してオブジェクトをインスタンス化し、ゲッターを介してデータを引き出して自分で実行するのではなく、明確に定義されたメソッドを使用してオブジェクトを実行するように依頼します。これがOOの全体的な目的です。つまり、オブジェクトにデータを要求して自分で実行するのではなく、オブジェクトに実行するように指示します

于 2012-09-25T10:02:32.950 に答える
0

上記の方法でコンストラクターを呼び出している場合は、変数の値を設定しています。したがって、作成したセッターメソッドには意味がありません。セッターメソッドを便利にしたい場合は、空のコンストラクターを作成してから、これらの関数を使用してください。

于 2012-09-25T09:43:43.623 に答える
0

ゲッターとセッターは、変数へのアクセスからの保護を提供します。さまざまなユーザーグループに対してさまざまなレベルの可視性を備えたゲッターとセッターを使用でき、コードの柔軟性が向上します。これは、すべての変数にゲッターとセッターが必要であることを意味するわけではありません。それらが提供できるアクセスのレベルと、それぞれのアクセスのレベルに組み込むことができる機能について、それらについてもっと考えてください。Sampleという名前のクラスは次のとおりです。

public class Sample {
   public static final int DEFAULT_QTY = 8;

   /**Create object with qty = 0*/
   public Sample(){
      setQty(DEFAULT_QTY);
      //this.qty = DEFAULT_QTY;//here makes no difference
   }

   /**Create object with qty if qty > 0*/
   public Sample(int qty){//drops confusion created by this.qty vs qty
      //provides built-in range protection through the constructor's use of setter
      setQty(qty);
   }

   /**@param qty The qty to set for this object, must be > 0*/
   public void setQty(int qty){
   if(qty > 0) {
       this.qty = qty;
   else {
      informUser(QTY_MUST_BE_>_0);
      //setQty(0); or getValidInput();
      }
   }

   /*@param forSureQty The pre-verified value to set for qty*/
   protected void setQtyNow(int forSureQty) {
       this.qty = forSureQty;
   }

   /**@return Returns the qty if qty < qtyAvailable, returns -1 otherwise*/
   public int getQty(){
      //Avoid problems with the computer selling more than you have available
      if(getQtyAvailable < this.qty) {
         //informUser(QTY_AVAILABLE = x QTY_NEEDED = >x);
         return -1;
      }
      return this.qty;
   }

   /*@return Returns the value of qty for this object*/
   protected getQtyNow()
      return this.qty;
   }

  private int qty;

}
于 2012-09-25T10:20:09.983 に答える
0

GetterSetterオブジェクト指向の原則を実装する方法ですEncapsulation

- Encapsulation最も基本的な形式では、を使用するようなものprivate fieldsですpublic Getter and Setters

-を使用する最も重要な理由は、に渡されるデータの検証Getter and Setterを実装することです。fields

例えば:

次の例では、ゲッターとセッターがないため、犬の体重を-10の無効な値に設定できます。

public class Dog{


   int weight;

    public static void main(String[] args){

                    new Dog().weight = -10;

           }


 }

例えば:

現在、SetterとGetterを使用してフィールドの重みを検証しています

public class Dog{


       int weight;

  public void setWeight(int i){

    if(i < 0){                        // Validation

           System.out.println("Invalid weight");

      }              

    else{
        this.weight = i;

     }

 }


  public int getWeight(){

       return this.weight;

 }

        public static void main(String[] args){

                        new Dog().setWeight(50);

               }


     }
于 2012-09-25T09:45:13.410 に答える
0

この場合、ゲッター/セッターは必要ありませんが、それでも常に使用することをお勧めします。後で、設定中に境界を確認したいことに気付いた場合。またはあなたがs.thを取得しているとき。いくつかのデータ変換を実行したい場合があります。

別の簡単な例:要素の構築中に値を設定したいので、セッターを実装せずにゲッターを実装します(また、これらのメンバー変数を常にプライベートに設定します。そうしないと、Setters/Gettersはかなり無意味になります)。

したがって、ほとんどの場合、それらはおそらく必要ありませんが、それでも常にSetters / Getters(imo)を使用することをお勧めします。

于 2012-09-25T09:45:24.337 に答える
0

パラメーター化されたコンストラクターがメンバー変数を初期化しています

  • 文字列_title;
  • 文字列_link;
  • 文字列_description;
  • 文字列_pubdate;
  • 文字列_guid;

getterとsetterの役割は、これらのメンバー変数との間で値を読み書きすることです。これらは、多くのJavaベースのフレームワークで広く使用されているため、従うべき標準です。

于 2012-09-25T09:45:29.777 に答える