我们总是说封装可以保证数据和功能免受外界影响。 因此,它是类周围的“保护性包装器”,并且可以保存代码以防止外部世界未经授权的访问。 但是如果我用 public 修饰符声明一个变量,会破坏封装吗?
public class EncapTest {
private String name;
private String idNum;
private int age;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getIdNum() {
return idNum;
}
public void setAge( int newAge) {
age = newAge;
}
public void setName(String newName) {
name = newName;
}
public void setIdNum( String newId) {
idNum = newId;
}
}
这样你的所有方法和变量都应该是私有的
。也许你只是违反了信息隐藏。 封装
不是信息隐藏。信息隐藏是比封装更基本的技术。我们应该澄清封装和信息隐藏之间的关系。 (参见参考)
封装是一种表达“边界”的技术 那些模块。这个问题假设我们的类中有一个属性,并且我们需要
从类外部设置一些值。我们不能将其定义为公共。我们也不能将其定义为受保护(参见
),定义此类条件的唯一方法是定义一些方法(或非常简单的接口中的一些修饰符)。在这种情况下,我们将其封装起来。 那么public属性和带有修饰符的
private属性有什么区别?
在一个非常大的项目中,我们可以在修改器中添加一些其他条件,而不需要对项目的其他部分(SOLID 的 OCP)进行任何更改。
:在某些情况下,我们需要将类外部的一些值设置为属性。所以有时候我们需要使用修饰符,这是访问字段的封装方式。我们无法在 OOP 中将字段定义为公共字段或受保护字段。
首先,让我们看看
encapsulation
封装是四个OOP概念之一。 在封装中,一个类的变量将对其他类隐藏,并且只能通过当前类的方法来访问。因此,它也被称为数据隐藏。
因此将类变量设为公共,它不再是封装了。
让我们看看封装的一些实际用法:
通过封装,您可以强制自己和其他开发人员通过他们的 getter 和 setter 访问该变量。说实话,这和这个领域是公开的一样,对吧? 但是如果您向设置器添加一些逻辑会怎么样?
public class User { private String username; private String password; // username getter and setter not displayed in this example. public void setPassword(String password) { this.password = someCoolHashingMethod(password); } public String getPassword() { return this.password; } }
你看到那里发生了什么吗?您强制将密码存储为散列而不是明文。 (保护密码的方法有很多,但我们暂时只使用这个虚拟示例)。
封装的另一个真正用途是您可以更改变量的名称,而无需更改应用程序中各处的代码。
所以,如果你改变了它的名称并且它没有被封装,你将不得不去你使用它的任何地方,修改它,在那里也进行改变。所以需要进行项目级别的重构。但如果它是封装的,你就到处使用 getter 和 setter!这意味着您只需要在那里更改它。示例:
public class User {
private String username;
private String pass; // <---- notice the new name
// username getter and setter not displayed in this example.
public void setPassword(String password) {
this.pass = someCoolHashingMethod(password); // <---- notice the new name
}
public String getPassword() {
return this.pass; // <---- notice the new name
}
}
希望这比您的问题的实际答案多一点。