我们总是说,封装使数据和功能与外界保持安全。 因此,它是一个强大的保护包装,可以保护代码免受外部世界的未授权访问。 但是,如果, 我用public修饰符声明一个变量会破坏Encapsulation吗?
答案 0 :(得分:0)
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;
}
}
这样你的所有方法和变量都应该是私有的
答案 1 :(得分:0)
在我的想法中,修饰符绝对支持封装。也许你只是违反隐藏信息。
封装不信息隐藏。信息隐藏是一种比封装更基本的技术。我们应该在封装和信息隐藏之间进行澄清。 (见the reference)
封装是一种表达边界的技术 那些模块。
假设我们的类中有一个属性,我们需要从类外部设置一些值。我们无法将其定义为公开。我们也不能将它定义为受保护(参见this question),定义这类条件的唯一方法是定义一些方法(或非常简单的接口中的一些修饰符)。在这种情况下,我们封装它。
那么公共属性和带有修饰符的私有属性之间有什么区别?
在一个非常大的项目中,我们可以向修改器添加一些其他条件,而无需对项目的其他部分(SOLID的OCP)进行任何更改。
最后:在某些情况下,我们需要将一些值从类外部设置为属性。所以有时我们需要使用修饰符,它是访问字段的封装方式。我们无法在OOP中将字段定义为公共字段或受保护。
答案 2 :(得分:0)
首先,让我们看看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;
}
}
你看看发生了什么呢?您强制将密码存储为散列而不是清除。 (保护密码的方法有很多,但现在我们将继续使用该虚拟示例。)
封装的另一个实际用途是,您可以更改变量的名称,而无需更改应用程序中各处的代码。
所以,你如果你改变它的名字,它不是封装的,你将不得不到处都用它,修改它,藏汉改变那里。因此,需要在项目级重构(refactorization)。但是,如果它包裹,您使用的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
}
}
希望这个答案比您的问题要多一点。
答案 3 :(得分:-1)
封装只允许班级中调它的变量。虽然一些变量可能是有用的,但是它们并没有被封装。通常,classestend被封装(更漂亮的编程风格)。 我要说的是,尝试用getter和setter封装所有变量(当然,这是公共的),有时候referance对于公共是有用的,或者getter和setter只是一个分配(不是null测试,等)删除它们并使该领域公开。