对于Encapsulation,我看到许多以Plain Java Bean(私有成员和公共getter& setter)为例的例子。但我认为这不是一个很好的例子,因为拥有一个带有公共吸气剂的私人变速器。 setter与拥有自己的公共varibale相同。有人可以在这方面帮助我吗?
答案 0 :(得分:2)
封装允许您隐藏单个类后面的编程,以便包含它,但也可以防止外部干扰。
您在上面说明的示例让您感到困惑,因为通过在同一个私有变量上创建getter和setter,您实际上是在暴露您的类(这对于良好的OO编程来说是禁忌)。
请尝试使用此示例:
public class Door {
private boolean locked;
private boolean open;
public boolean openDoor() {
if (locked || open) {
return false; //You can't open a locked or already open door
}
open = true;
return true;
}
}
现在,在这个(相当简单的)示例中,您将为最终用户提供一个名为openDoor()的方法,该方法允许他们与门进行交互,而无需让他们直接访问某些私有变量,这些变量实际上控制着您的门是否打开甚至可以打开。
所以你仍然会与那些私有变量进行交互,但是现在你的最终用户不需要知道关于这个门的机制的任何信息...只是他们有一个接口(通过openDoor()方法)操纵对象。
顺便提一下,封装为您将来维护此Door类的能力带来了极大的好处。比如说,你有另一个类(比如Person类)依赖于这个openDoor()方法。如果您需要在类中添加一个新变量来表示第二个deadbolt变量,该怎么办?
如果没有封装,您需要编辑Door类和必须与新deadbolt变量交互的Person类,以确定是否可以打开门。但是通过封装,所有维护都可以保留在Door类的内部。 Person类永远不需要知道openDoor()包含的逻辑与以前不同。
答案 1 :(得分:2)
封装很重要,原因如下:
通过在某些属性/方法上设置私有/受保护范围来隐藏实现细节
最常见的是,确保数据封装的一致性。例如,假设您正在编写一个具有属性int myInt
的类,其约束条件是myInt应始终为正数。如果将myInt作为公共属性解析,则用户可以自由地将其设置为负值,从而打破一致性约束,而这个简单的代码可以保护对象的状态:
private myInt = 0;
public void setMyInt(int value) {
if (value < 0)
throw new IllegalArgumentException("myInt should be positive");
myInt = value;
}
有时你想延迟一个属性的评估(一种懒惰的属性),所以你在构造函数中将它的值设置为null,然后你提供一个第一次计算它的getter然后表现得像一个“正常”的吸气者:
//delayed attribute
private List<User> users = null;
public List<User> getUsers() {
if (users == null)
users = someMethodWithHighComputationCost();
return users;
}
答案 2 :(得分:0)
private boolean a = true;
public boolean getA(){
return a;
}
public void setA(boolean a){
this.a = a;
}
您无法访问n#39;私人&#39;来自另一个类的变量,但您可以访问公共变量。
答案 3 :(得分:0)
Java或面向对象编程语言中的封装是一种强制保护变量,来自类外的函数的概念,以便更好地管理该段代码,并且由于更改而对程序的其他部分影响最小或没有影响。受保护的代码Java中的封装在不同的地方是可见的,Java语言本身提供了许多构造来封装成员。
封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。如果某个字段被声明为私有,则该类之外的任何人都无法访问该字段,从而将该字段隐藏在该类中。
实施例: 让我们看一个描述封装的例子:
public class Employee{
private String name;
private int age;
public int getAge(){
return age;
}
public String getName(){
return name;
}
public void setName(String newName){
name = newName;
}
public void setIdNum( String newId){
idNum = newId;
}
}
公共方法是来自外部Java世界的此类字段的访问点。通常,这些方法称为getter和setter。因此,任何想要访问变量的类都应该通过这些getter和setter访问它们。
封装的好处: