使用Getters和Setters

时间:2012-09-25 09:37:30

标签: java

  

可能重复:
  Why use getters and setters?

我现在已经看到了一段时间的讨论,我仍然不知道这样的事情是如何工作的,我对java知之甚少,我知道它们是getter和setter但是它们在我的代码中执行的功能正是因为它似乎它只是指自己没有执行特定的代码块 我只需要一个非常简单的解释,而不是寻求辩论。

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

6 个答案:

答案 0 :(得分:2)

构造函数在一个原子操作中执行对象的初始化。当您调用构造函数时,返回时您将拥有一个完全创建的对象。将它与一个简单的无参数构造函数进行比较,然后是一组setter。在这种情况下,您可以轻松地创建一个不完整的对象。

你是否应该使用智能构造函数来获取args并完全构建对象而不是一系列setter?一般来说,是的。原因如下:

  1. 操作是原子的,会给你一个完整,正确的对象(我假设你验证输入)
  2. 您可以提供覆盖以从字段,字符串/流等创建对象。
  3. 通过使用final字段,您可以创建不可变对象。这对于确定可靠性(尤其是线程)和调试问题非常有用。
  4. 通常我将setter / getters的集合看作是糟糕的OO设计。最基本的是它们只暴露内部领域。您可以提供验证等,但您仍然可能会暴露实施。

    我宁愿使用构造函数实例化对象,然后让它使用定义良好的方法为我做事,而不是通过getter将数据拉出来并自己完成。这是OO的总体目标 - 告诉对象为您做事而不是向他们索取数据并自己做

答案 1 :(得分:0)

如果按照上面提到的方式调用构造函数,则设置变量的值;所以你创建的setter方法没有意义。如果要使setter方法有用,请创建一个空构造函数,然后使用这些函数。

答案 2 :(得分:0)

GetterSetter是实现Encapsulation的面向对象原则的一种方式。

最基本形式的

- Encapsulation就像拥有private fields public Getter and Setters一样。

- 使用Getter and Setter的最重要原因是实施传递给fields的数据的验证

<强>例如

在下面的示例中,没有getter和setter,因此Dog的权重可以设置为无效值-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);

               }


     }

答案 3 :(得分:0)

在这种情况下,您不需要Getters / Setters,但仍然可以使用它们。如果您稍后注意到要在设置时检查边界。或者当你得到s.th.您可能想要执行一些数据转换。

另一个简单的例子:你只想在构造元素期间设置一个值,所以你只是不实现一个setter但是你实现了一个getter(同样,总是将这些成员变量设置为private,否则Setters / Getters非常无意义。)

所以在大多数情况下你可能不需要它们,但总是使用Setters / Getters(imo)仍然是一个好主意

答案 4 :(得分:0)

您的参数化构造函数正在初始化您的成员变量

  • String _title;
  • String _link;
  • String _description;
  • String _pubdate;
  • String _guid;

getter和setter的作用是从这些成员变量读取和写入值。它们更像是一种标准,因为它被广泛用于许多基于Java的框架作品中。

答案 5 :(得分:0)

Getters和setter可以防止访问您的变量。您可以为不同的用户组使用具有不同可见性级别的getter和setter,并提高代码的灵活性。这并不意味着每个变量都需要一个getter和setter。更多地考虑它们可以提供的访问级别以及可以构建到各自访问级别的功能。这是一个名为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;

}