我们常说,封装使数据和功能不受外界的影响。因此,它是一个围绕类的保护包装器,可以将代码从外部世界未经授权的访问中保存下来。但是,如果我声明了一个带有公共修饰符的变量,它会破坏封装吗?
发布于 2018-01-27 08:50:51
Java中的封装是一种将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。在封装中,类的变量将被隐藏在其他类中,并且只能通过其当前类的方法来访问。因此,它也被称为数据隐藏。
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;
}
}
所以所有的方法和变量都应该是私有的。
发布于 2018-01-29 09:56:04
在我看来,修饰符绝对支持Encapsulation.也许你只是违反了信息隐藏。
封装是,而不是信息隐藏。信息隐藏是一种比封装更基本的技术。我们应该澄清封装和信息隐藏之间的关系。(见参考文献)
封装是表示这些模块的边界的一种技术。
假设类中有一个属性,并且需要从类外部设置一些值。我们不能把它定义为公共的。我们也不能将其定义为受保护的(参见这个问题),定义这种条件的唯一方法是定义一些方法(或者在非常简单的接口中定义一些修饰符)。在这种情况下,我们封装了它。
那么,公共属性和带有修饰符的私有属性之间有什么区别呢?
在一个非常大的项目中,我们可以向修饰符添加一些其他条件,而不会对项目的其他部分(SOLID的OCP )进行任何更改。
最终:在某些情况下,我们需要将类外部的一些值设置为属性。因此,有时我们需要使用修饰符,这是访问字段的封装方式。在OOP中,不能将字段定义为公共字段或保护字段。
发布于 2019-01-31 18:14:45
首先,让我们看看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
}
}
希望你的回答比你的问题要多一点。
https://stackoverflow.com/questions/48474007
复制相似问题