设置和获取方法vs公共variables的优点

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

有没有什么好处,让方法访问你的类中的私有variables,而不是公开的variables?

比如第二种情况比第一种好?

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

我所看到的有一天,作为回答(由@ ChssPly76写)为什么要使用getters和setters

因为从现在起2个星期(几个月,几年),当你意识到你的制定者需要做的不仅仅是设置价值,你还会意识到这个属性已经被其他238个类直接使用了:-)

还有更多的优点:

  1. getter和setter 可以在其中进行validation ,字段不能
  2. 使用getter你可以得到想要的类的类。
  3. getters和setter 是多态的 ,字段不是
  4. debugging可以简单得多,因为断点可以放在一个方法中,而不是靠近给定字段的许多引用。
  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时,另一个新的优点 – 你可以在字段上创build观察点,但是如果你有setter你只需要一个断点,… 断点(例如在setter方法)可以是有条件的,观察点不能 。 所以如果你只想在x=10停止你的debugging器,那么只能用setter中的断点来完成。

使用公共variables可能会导致设置错误值的variables,因为input值不能被检查

例如:

  public class A{ public int x; // Value can be directly assigned to x without checking. } 

使用setter可以通过检查input来设置variables。 保持实例varibale是私有的,getter和setter public是封装 getter的一种forms,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; } 

多态性示例: 我们可以将Subtypes的Object Referncevariables作为参数从Calling方法分配给被调用方法的Super Class参数的Object Referncevariables。

 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"); } } } 
  1. 一些库需要这个来实现“Java Bean标准”。
  2. setter / getter可以在一个接口中,一个属性不能在一个接口中
  3. 安装者/获取者可以很容易地在下降的类中被覆盖。
  4. setter / getters抽象了一个值是按需计算还是只是一个属性的访问器

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

有没有什么情况下,通过使成员variables公开化来暴露你的课堂的内部运作是更好的,所以任何消费者都可以做一些devise师从来没有想过的事情,从而导致失败的盛宴和崩溃的聚宝盆?

答案本身真的不是吗?

OO的基石原理,封装。 公共成员variables基本上是全局variables,前缀…