public修饰符将破坏封装属性

时间:2018-01-27 08:28:30

标签: java oop core

我们总是说,封装使数据和功能与外界保持安全。 因此,它是一个强大的保护包装,可以保护代码免受外部世界的未授权访问。 但是,如果, 我用public修饰符声明一个变量会破坏Encapsulation吗?

4 个答案:

答案 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测试,等)删除它们并使该领域公开。