68

可能重复:
为什么要使用 getter 和 setter?

使方法访问类中的私有变量而不是使变量公开有什么好处?

例如,第二种情况是否比第一种更好?

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

}
4

4 回答 4

101

我有一天在 SO 上看到的,作为答案(由 @ChssPly76 编写)为什么要使用 getter 和 setter

因为从现在起 2 周(月、年)后,当您意识到您的 setter 需要做的不仅仅是设置值时,您还将意识到该属性已直接在 238 个其他类中使用:-)

还有更多优点:

  1. getter 和 setter可以在其中进行验证,字段不能
  2. 使用 getter 你可以获得想要的类的子类。
  3. getter 和 setter是多态的,字段不是
  4. 调试可以简单得多,因为断点可以放置在一个方法中,而不是靠近该给定字段的许多引用。
  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; }

编辑:使用 Eclipse 时的另一个新优势 - 您可以在字段上创建观察点,但如果您有设置器,您只需要一个断点,并且...断点(例如在 setter 方法中)可以是有条件的,观察点(在字段上)不能。因此,如果您只想停止调试器x=10,则只能在设置器中使用断点来执行此操作。

于 2012-06-17T12:52:08.817 回答
11

使用公共变量可能会导致为变量设置错误的值,因为无法检查输入值

例如:

 public class A{

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

   }

使用 setter 可以通过检查输入来设置变量。保持实例变量私有,getter 和 setter 公开是一种封装形式, getter 和 setter 也兼容Java Beans 标准

getter 和 setter 也有助于实现多态性概念

例如:

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

             }
         }
      }
于 2012-06-17T12:56:51.903 回答
6
  1. 一些库需要它来满足“Java Bean 标准”。
  2. setter/getter 可以在接口中,属性不能在接口中
  3. Setter/getter 可以很容易地在后代类中被覆盖。
  4. setter/getter 抽象出值是按需计算还是只是属性的访问器的信息
于 2012-06-17T12:55:57.540 回答
3

有点倒退的看待事物的方式。

在任何情况下,最好通过公开成员变量来公开类的内部工作,以便它的任何消费者都可以做设计者从未想到的事情,从而导致失败的盛宴和崩溃的聚宝盆?

某种答案本身真的不是吗?

OO的基石原则,封装。公共成员变量基本上是带有前缀的全局变量......

于 2012-06-17T13:27:35.187 回答