首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >公共修饰符将破坏封装属性。

公共修饰符将破坏封装属性。
EN

Stack Overflow用户
提问于 2018-01-27 08:28:30
回答 3查看 598关注 0票数 0

我们常说,封装使数据和功能不受外界的影响。因此,它是一个围绕类的保护包装器,可以将代码从外部世界未经授权的访问中保存下来。但是,如果我声明了一个带有公共修饰符的变量,它会破坏封装吗?

EN

回答 3

Stack Overflow用户

发布于 2018-01-27 08:50:51

Java中的封装是一种将数据(变量)和作用于数据(方法)的代码作为一个单元包装在一起的机制。在封装中,类的变量将被隐藏在其他类中,并且只能通过其当前类的方法来访问。因此,它也被称为数据隐藏。

代码语言:javascript
运行
复制
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;
   }
}

所以所有的方法和变量都应该是私有的。

票数 0
EN

Stack Overflow用户

发布于 2018-01-29 09:56:04

在我看来,修饰符绝对支持Encapsulation.也许你只是违反了信息隐藏

封装是,而不是信息隐藏。信息隐藏是一种比封装更基本的技术。我们应该澄清封装和信息隐藏之间的关系。(见参考文献)

封装是表示这些模块的边界的一种技术。

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-01-31 18:14:45

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

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

,所以公开一个类变量,这不再是封装。

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

通过封装,您可以强迫自己和其他开发人员通过他们的getter和setter访问该变量。说实话,这场比赛好像是公开的一样,对吧?但是如果你给设置者添加了一些逻辑呢?

代码语言:javascript
运行
复制
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!这意味着你只需要在那里改变它。示例:

代码语言:javascript
运行
复制
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
    }

}

希望你的回答比你的问题要多一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48474007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档