我已经阅读了100多个链接并探索了所有SO上的问题,但是:(仍然无法理解数据隐藏和封装之间的区别。在阅读this answer时,我读到了这一行数据隐藏是封装,但并非所有封装都是数据隐藏。所以经过大量研究,我发现1)数据隐藏通过封装实现或者它是封装的一种形式(我是对的吗?)2)如果是的话,应用访问限定符就是数据隐藏(也是封装),但是只有封装而不是数据隐藏的机制是什么?
1) 可以通过不使用封装来实现数据隐藏,一个例子是类中的私有常量,该常量不会被任何“getter”返回。
2) 应用访问修饰符可能是数据隐藏和封装。您可以实现封装但无法实现数据隐藏,当您公开数据但仅允许由getter和setter修改时。
数据隐藏和封装是非常不同的概念,但相关联。数据隐藏是关于不泄露您的类的任何用户实现细节,而封装则是防止数据意外更改。
我找到的最好的解释在书籍“Growing Object Oriented Systems Guided by Tests”中(第49页)
作者说,封装几乎总是一件好事,但是数据隐藏可能在错误的位置,他们给出了以下示例:
以上两个示例听起来都很合理,但是从数据隐藏的角度来看:
在缓存的示例中,隐藏它是有意义的。但是对于应用程序日志文件名称,隐藏它就没有意义。
抽象化
专注于基本方面并隐藏背景/实现细节
专注于对象的外部视图。例如:堆栈类[抽象化侧重于类推送、弹出提供的服务]
封装
信息隐藏
封装是确定将对象的哪些状态和行为放在一起的决策,而信息隐藏是决定向用户公开哪些封装项以及不向用户公开哪些封装项的决策。
封装可以隐藏复杂性。就像我们创建getter和setter一样。
但是数据隐藏意味着隐藏某些内容,在Java中,我们可以使用访问修饰符来完成。