【问题标题】:public modifier will break encapsulation propertypublic 修饰符将破坏封装属性
【发布时间】:2018-01-27 08:28:30
【问题描述】:

我们总是说,封装可确保数据和功能不受外界影响。 所以它是一个围绕类的保护性包装器,并且可以保存代码以防止外部世界未经授权的访问。 但如果, 我用 public 修饰符声明一个变量会破坏封装吗?

【问题讨论】:

  • 是的,不要那样做。
  • 谢谢..!!公共方法呢?
  • 这取决于。您需要决定要公开什么。通常,不要公开与实现细节相关的任何内容。即这个类的用户不需要需要知道什么?
  • 是的,它被认为是一种不好的做法。 stackoverflow.com/questions/8002928/…

标签: java oop core


【解决方案1】:

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;
   }
}

这样你所有的方法和变量都应该是私有的

【讨论】:

    【解决方案2】:

    在我的想法修饰符绝对支持封装。也许你只是违反了信息隐藏

    封装不是信息隐藏。信息隐藏是比封装更基础的技术。我们应该澄清封装和信息隐藏之间的关系。 (见the reference

    封装是一种表达边界的技术 那些模块。

    假设我们的类中有一个属性,我们需要从类外部设置一些值。我们不能将其定义为公开的。我们也不能将其定义为受保护的(请参阅this question),定义此类条件的唯一方法是定义一些方法(或在非常简单的接口中定义一些修饰符)。在这种情况下,我们封装它。

    那么公共属性带有修饰符的私有属性有什么区别呢?

    在一个非常大的项目中,我们可以在修改器中添加一些其他条件,而不需要对项目的其他部分(SOLID 的 OCP)进行任何更改。

    最后:在某些情况下,我们需要从类外部为属性设置一些值。所以有时我们需要使用修饰符,它是访问字段的封装方式。我们不能在 OOP 中将字段定义为公共或受保护的。

    【讨论】:

      【解决方案3】:

      首先,让我们看看encapsulation到底是什么。

      封装是四个 OOP 概念之一。 在封装中,一个类的变量对其他类是隐藏的,只能通过其当前类的方法访问。因此,也称为数据隐藏。

      因此,公开一个类变量不再是封装。

      让我们看看封装的一些实际用法:

      通过封装,您可以强迫自己和其他开发人员通过他们的 getter 和 setter 访问该变量。老实说,这就像该领域是公开的一样,对吧? 但是如果你给 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
          }
      
      }
      

      希望这比你的问题回答得更多。

      【讨论】:

        猜你喜欢
        • 2017-02-02
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 2016-06-03
        • 2022-12-14
        相关资源
        最近更新 更多