我正在阅读“实践中的Java并发性”,有人说:“幸运的是,相同的面向对象技术可以帮助您编写组织良好,可维护的类(例如封装和数据隐藏),也可以帮助您创建线程安全的类。”
问题#1-我从未听说过数据隐藏,也不知道它是什么。
问题2-我一直认为封装使用的是私有vs公共,实际上是在隐藏数据。
您能否解释一下什么是数据隐藏以及它与封装有何不同?
我正在阅读“实践中的Java并发性”,有人说:“幸运的是,相同的面向对象技术可以帮助您编写组织良好,可维护的类(例如封装和数据隐藏),也可以帮助您创建线程安全的类。”
问题#1-我从未听说过数据隐藏,也不知道它是什么。
问题2-我一直认为封装使用的是私有vs公共,实际上是在隐藏数据。
您能否解释一下什么是数据隐藏以及它与封装有何不同?
Answers:
数据和信息隐藏是计算机科学与软件工程中的更广泛概念。它指的是计算机程序的那些可能更改的部分一定不能从其他模块/客户端访问。
封装是在面向对象范例中找到的一个术语,是指将数据保留在私有字段中并仅通过方法对其进行修改。
因此,封装可以被视为在面向对象的系统中实现数据隐藏的一种方式。
创建一个类包括封装的概念。创建类时,您将数据和行为放入类内,并且该类成为我们称为对象的一个单元。因此,数据隐藏是封装的一部分。
从维基百科:
在编程语言中,封装用于指两个相关但截然不同的概念之一,有时还指其组合:
- 一种语言机制,用于限制对某些对象组件的访问。
- 一种语言构造,它有助于将数据与对数据进行操作的方法(或其他功能)捆绑在一起。
一些编程语言研究人员和学者将第一种含义单独或与第二种含义结合使用,作为面向对象编程的显着特征,而其他提供词汇闭包的编程语言则将封装视为与对象定向正交的语言的特征。
第二个定义的动机是,在许多OOP语言中,组件的隐藏不是自动的或可以被覆盖的; 因此,信息隐藏被那些喜欢第二种定义的人定义为一个单独的概念。
它们经常在讨论中互换使用,我经常认为它们可以共同实现相同的目的,尽管以下内容可能并不完全准确,但如果需要加以区别,它可能会提供一些有意义的区别:
在谈论封装时,通常将其实现为过程/功能机制。底层状态有某种类型的防护,通过防护的访问要求遵循某些协议以提供访问权限(读取或更改所需状态)。封装还提供了因访问而发生副作用的机会(例如级联状态更改,或在读取或更改感兴趣的事物时通知/引发事件/发出信号),因此可以启动后续操作。同样,我经常将封装视为一个概念,将其作为过程来实现。
我看到数据隐藏的概念与封装的目的相似。但是,该机制是结构性的,并且在不同的级别上运行。实际上,不是通过过程提供保护和副作用机制,而是通过语言和运行时的结构机制来保护和影响状态。这些类型的保护措施包括可见性子句,类型定义,继承等。您可以从结构受保护的对象中利用的副作用又取决于语言和运行时:可能是对象激活,引用计数或类似的东西。
在OO中,封装是将信息保存在对象内的位置。例如,一个Person
具有name
和的Person的客户(即您)通过公共字段或访问器方法知道 Person拥有一个名称。而且,希望您不必将这些名称也保存在某些全局名称数组中,等等。因此,这是避免难以管理的意大利面条式代码的重要一步。但是客户端仍然需要了解有关Person如何处理名称的某些知识:例如,空格或逗号分隔?
数据隐藏是Person
一个具有名称字段的地方,但至少在理论上,没人知道。该字段是私有的,没有公共访问器方法。客户端可以通过数据库记录,XML,HTTP POST等传递名称,但是Person处理名称的内部工作是一个“黑匣子”。Person的未来实现可以自由更改,例如切换为使用a firstName
和a lastName
。
在理想的世界中,数据隐藏优于封装,但并非所有世界都理想。:-)