使用方法访问类中的私有变量而不是将变量公开是否有任何优势?
例如,第二种情况比第一种情况好吗?
//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;
}
}
答案 0 :(得分:73)
我有一天在SO上看到的,作为答案(由@ ChssPly76编写)为什么要使用getter和setter
因为从现在起2周(几个月,几年),你意识到你的 setter需要做的不仅仅是设置值,你也会意识到 该物业已被直接用于其他238个类别: - )
还有更多优势:
之前:
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,则只需要一个断点,并且...... 断点(例如在setter方法中)可以是有条件的,观察点(在场上)不能。因此,如果您只想在x=10
{{1}}停止调试器,则只能使用setter中的断点。
答案 1 :(得分:8)
使用公共变量可能会导致设置错误的值,因为无法检查输入值。
例如:
public class A{
public int x; // Value can be directly assigned to x without checking.
}
使用setter可以使用检查输入来设置变量。保持实例varibale私有,getter和setter public是 Encapsulation 的一种形式 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;
}
多态示例:我们可以将Sub类型的Object Refernce变量作为Argument从Calling方法分配给被调用方法的超类参数的Object Referencence变量。
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");
}
}
}
答案 2 :(得分:4)
答案 3 :(得分:1)
看待事物的某种倒退方式。
在任何情况下,最好通过将成员变量公开来暴露你的班级的内部工作,所以任何消费者都可以做设计师从未认识的事情,导致失败的盛宴和崩溃的聚宝盆?
答案本身真的是一个人不是吗?
OO的基石原理,封装。公共成员变量基本上是全局变量,带有前缀...