java - 信息隐藏和封装有什么区别?

标签 java oop encapsulation modularity information-hiding

信息隐藏封装有什么区别?

我读到封装意味着将数据和应该对它们进行操作的过程捆绑在一起。如果是这样,下面的类是否实现了封装?

class IsThisEncapsulation {
    public int age;

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在声明数据属性ageprivate是否可以实现信息隐藏?

最佳答案

封装和信息隐藏是紧密相关的概念,尽管它们的准确定义因谈话对象而异。

“信息隐藏”的概念最早由 Parnas (1972) 描述谁建议限制信息访问以减少系统的相互关联性。他提议,这将有助于将系统拆分为模块,同时保持用户友好的外部界面,并允许在不影响客户的情况下更改实现细节。

术语“封装”是由 Zilles (1973) 创造的描述使用程序来控制对基础数据的访问,以降低系统复杂性并保护数据免遭危险修改。

随后,Parnas (1978)将信息隐藏和封装(和抽象)描述为同义词,它们描述了对可能发生变化的系统细节的隐藏。然而,信息隐藏和封装之间存在区别,例如Micallef (1987)。 ,谁将封装描述为“信息隐藏的严格执行”。一些作者,例如 Cohen (1984)Abreu and Melo (1996)描述“封装机制”,尤其是在面向对象的编程语言中,允许信息隐藏。

Meyers (2000)表明一段代码被封装的程度取决于代码的数量,如果代码发生变化,这些代码将被破坏。从这个意义上讲,私有(private)数据和方法被封装得越多,访问它们的方法越少。相比之下,公共(public)数据和方法是完全未封装的,因为可以访问它们的代码量是未知的。

相反,Rogers (2001)表明封装只是一种语言机制,它允许数据与操作该数据的方法捆绑在一起。他声称封装从根本上与信息隐藏无关。然而,这个定义与他的文章发表前 28 年学术文献中几乎所有的术语用法背道而驰。 还有这种用法的一些其他示例,例如 Archer and Stinson (1995) , 但它们很少见,也不是特别引人注目。

总而言之,信息隐藏是指信息应该被隐藏,以便可以在不影响客户的情况下更改设计。这样可以提高灵 active 和安全性。封装可能被认为与信息隐藏相同,但该术语通常用于描述信息隐藏的实际实现,尤其是在面向对象编程中。

作为信息隐藏/封装的例子,考虑这个类:

public class BankAccount {
    public int dollars;
}

这个类的实现是完全未封装的,这意味着它是不灵活的(例如我们以后不能轻易添加对单个美分的支持)并且不安全(例如帐户可以更改为负数)。但是,如果我们将数据隐藏在正式定义的方法接口(interface)后面,我们将获得灵 active 和安全性。

public class BankAccount {
    private int dollars;

    public void deposit(int dollars) {
        this.dollars += Math.max(0, dollars);
    }
}

我们现在可以控制状态的修改方式,我们还可以在不破坏客户端代码的情况下更改实现:

public class BankAccount {
    private int cents;

    public void deposit(int dollars) {
        deposit(dollars, 0);
    }

    public void deposit(int dollars, int cents) {
        this.cents += Math.max(0, 100 * dollars) + Math.max(0, cents);
    }
}

类现在被更好地封装了,因为我们隐藏了有关其底层实现的信息。

关于java - 信息隐藏和封装有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13913174/

相关文章:

java - 从 Java 转换时,gwt 可以生成 .js 而不是 .html 文件吗?

java.util.concurrent.TimeUnit 类设计模式

php - 在 PHP 中用类扩展特征?

c++ - 在不破坏封装的情况下访问功能替代品

java - 对象数组测试但没有得到任何输出

java - android 数组通过可绘制资源与 onClick 事件

java - 在访问实例化和构造函数配置的不可变对象(immutable对象)的基本类型( double )时出现 NPE。 (不涉及自动装箱或反射)

Java:什么时候使用属性,什么时候使用方法参数?

java - Java中集合类的继承与封装

javascript - 使用模块模式创建许多实例