数据隐藏是封装,但并非所有封装都是数据隐藏

时间:2013-06-19 11:20:40

标签: java oop encapsulation

我已阅读了近100多个链接,并探讨了有关SO的所有问题但是:(仍无法理解
数据隐藏和封装之间的区别
在阅读时{ {3}}我读了这一行 数据隐藏是封装,但并非所有封装都是数据隐藏
因此,经过大量的研究,我发现通过封装实现了数据隐藏或者它是封装的一种形式(我是对的)吗? 1)
2)如果是,则应用访问说明符是数据隐藏(以及封装)但是什么是仅封装但不是数据隐藏的机制

3 个答案:

答案 0 :(得分:4)

答案简短:

1)数据隐藏可以在没有封装的情况下实现,这样的一个例子就是类中的私有常量,并且任何'getter'都不会返回该常量。

2)应用访问修饰符可能是数据隐藏和封装。在公开数据时,您可以实现封装,但不能实现数据隐藏,但只能由getter和setter修改。

答案很长:

数据隐藏和封装是完全不同的东西,但相关的概念。数据隐藏不会泄露任何类用户的实现细节,而封装可以防止对数据进行意外更改。

我发现的最好的解释是在“以测试为导向的面向对象系统的增长”(第49页)一书中

作者所说的封装几乎总是一件好事,但数据隐藏可能在错误的地方,并且它们给出了以下示例:

  • 在Loader类
  • 中封装缓存的数据结构
  • 在PrivacyPolicy类
  • 中封装应用程序日志文件的名称

以上两种声音都是明智的,直到我们从数据隐藏的角度来看它们

  • 在Loader类
  • 中隐藏缓存的数据结构
  • 在PrivacyPolicy类中隐藏应用程序日志文件的名称

在缓存的示例中,隐藏它是有意义的。但是关于应用程序日志文件名,隐藏它是没有意义的。

答案 1 :(得分:0)

Abstaction

  • 重点关注基本方面并隐藏背景/实施细节

  • 专注于对象的外部视图 示例:Stack类[Abstaction专注于Push,Pop类提供的服务]

  • 抽象允许捕获整个对象的行为。
  • 重点关注可以做什么对象
  • 它有助于根据责任驱动的方法识别班级[根据班级的责任将系统分类为一组对象]

<强>封装

  • Bundeling状态和对象进入单个单位的行为
  • 通过定义类[识别状态和行为并将这两个事物放在一起]来实现
  • 允许将对象的状态和行为保持在一起
  • 它没有隐藏实现细节,其目的是识别状态和行为并将这些内容保持在一起
  • 它专注于对象的内部视图,而abstaction专注于对象的外部视图
  • 封装有助于实现抽象

隐藏信息

  • 封装必须只允许显示必要的服务。隐藏与封装相关的概念的信息需要隐藏对象的实现细节
  • 信息隐藏和封装不一样
  

封装是决定识别哪些状态和行为的决定   将信息隐藏起来,将对象放在一起   决定将哪些封装项目透露给用户   什么不被重新赐给用户

答案 2 :(得分:0)

封装隐藏复杂性。就像我们正在创建getter和setter ..

但数据隐藏意味着隐藏某些东西而在java中我们可以使用访问修饰符来完成,即