- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我正在使用这本书:Core Java Volume I--Fundamentals。
它定义封装如下:
Encapsulation (sometimes called information hiding) is a key conceptin working with objects. Formally, encapsulation is simply combiningdata and behavior in one package and hiding the implementation detailsfrom the users of the object.
通过在SO中搜索,我知道封装和信息隐藏是独立的概念,但结合使用。但是,为了这个问题,让我们坚持本书的定义(即封装==实现隐藏),因为这个问题使用了书中的示例。
public class Math
{
. . .
public static final double PI = 3.14159265358979323846;
. . .
}
书上说这不会破坏封装,因为它是一个常量。但是上面的代码是否破坏了封装的实现隐藏部分(根据本书的定义),因为 PI 不仅对类可见,而且对程序的其余部分都可见。
我的问题实际上可能与此重复:Does a public static const variable break the encapsulation ideology? (虽然用 C++ 标记)但答案说它确实违反了封装(与书相矛盾),那没关系。我知道我的问题是否因为可能重复而被关闭
编辑:我将发布另一个示例代码作为评论,提到 PI 不被视为实现细节
public class System
{
. . .
public static final PrintStream out = . . .;
. . .
}
最佳答案
很好的问题。我不认为您提供的示例破坏了封装,至少不是严格意义上的。
您给出的第一个示例是常量 PI,第二个示例提供对 System 中的 out 常量的访问;大概是为了使用一些代码,例如 System.out.println("HelloWorld!");
。正如其他人已经提到的,PI 实际上只是一个常量,常量的用户无法修改或影响该值。 PI
的用户仍然需要在其代码中引用常量(此处构成 API)。如果 PI
被修改(不太可能,但谁知道),用户将不会受到该更改的影响,因为无论如何他们都需要重新编译代码。
考虑封装的一个有用方法是考虑破坏封装需要什么。 《Effective Java》第 3 版在第 16 条中对此进行了很好的描述,表明如果没有适当的封装,“您无法在不更改 API 的情况下更改表示形式,无法强制执行不变量,并且在访问字段时无法采取辅助操作。 ”
下面的类非常明显地违反了上述规定(也在《Effective Java》的第 16 条中):
class Point {
public double x;
public double y;
}
所有字段都是公共(public)的,此 API 的用户将被迫直接使用这些字段。如果稍后作者决定在访问或修改 x
或 y
之前添加一些验证检查,那么在不破坏现有客户端的情况下就不可能这样做。 API 必须进行重大修改,并且可能会破坏下游用户的行为。
现在让我们看看您提供的第二个示例:
public class System
{
. . .
public static final PrintStream out = . . .;
. . .
}
这看起来与上面的 PI
示例非常相似,但有一个关键区别:有问题的字段是 PrintStream。虽然 out
字段本身是此 API 的一个明显部分,现在可能很难更改(现在它已公开,客户端将使用并依赖它),但 PrintStream
type 是一个类,这实际上是这里有趣的地方:用户将引用该类的方法。在这里,我们拥有 PrintStream
API 中的关键功能,这些功能可以随着时间的推移而发展,而不会中断使用。将来也可能将 out
常量更改为引用不同的 PrintStream
子类,并且 API 的用户应该不受影响。
希望有帮助。
关于java - 静态常量是否违反 "encapsulation"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62485154/
例如,我有一个基本上以这种方式工作的函数: function myfunc(data,type_of_analysis){ if type_of_analysis is "Smith-Jone
你能告诉我软件开发中的抽象和信息隐藏有什么区别吗? 我很困惑。抽象隐藏了细节实现信息隐藏抽象了事物的全部细节。 更新:我找到了这三个概念的一个很好的答案。 See the separate answe
如果类A和类B是组合关系,是不是意味着通过A得到的B的具体实例只能通过类A修改,不能破坏类A的数据封装?或者,组合是否仅意味着生命周期绑定(bind),而不是数据封装? class A { B
在使用 Web 组件的项目之后,我将回到 AngularJS。令我感到沮丧的是,我找不到合适的方法让指令将其 CSS 保持在内部(或封装)。 使用 web 组件我没有这个问题,因为已经有一个样式标签可
好吧,我正在使用这本书:Core Java Volume I--Fundamentals。 它定义封装如下: Encapsulation (sometimes called information h
好吧,我正在使用这本书:Core Java Volume I--Fundamentals。 它定义封装如下: Encapsulation (sometimes called information h
我已经阅读了整个 Swift book , 并观看了所有 WWDC videos (我衷心推荐所有这些)。我担心的一件事是数据封装。 考虑以下(完全人为的)示例: class Stack {
有一次我读到 MSDN article这鼓励了以下编程范式(它不是 100% 正确的......见编辑): public class MyClass { public void Method1
我有一个问题我已经苦苦思索了很长一段时间。我正在构建一个具有两个主要类的模板引擎 Template.php和 Tag.php , 有一堆扩展类,比如 Img.php和 String.php . 程序是
所以我在这里尝试做一些所有程序员有一天可能也必须做的事情。 我的代码中有所有这些嵌套宏,我想在每个 #endif 旁边添加注释,其中 #if 它关闭 - 如果还没有注释。正则表达式可以为我做到这一点吗
我在使用 不是封装类 的 SwingWorker 类传递信息、更新进度和指示“完成”时遇到问题。 我有一个简单的类来处理硬盘驱动器上的文件和目录。用户单击 Start 按钮并启动 SwingWorke
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Abstraction VS Information Hiding VS Encapsulation “抽象
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: Why use getters and setters? 为什么要使用 getter 和 setter? 最佳答案
我最近开始使用智能指针。如果我是正确的,则声明智能指针: shared_array a(new double[n]); 但是如果a被封装在一个类中怎么办呢?目前我正在做如下,但这看起来 super 丑
目前我有以下代码: import UIKit struct ToBeSearched { var value1 = "1" var value2 = "3" var value
我在准确表述它时遇到问题,所以我在标题中留下了更笼统的描述(如果您对问题有更准确的描述,请发表评论,我会编辑标题)。 问题: AudioStream 和VideoStream 两个类派生自基类Medi
Bob Martin 在这 video说“C 有完美的封装”。我不明白他为什么这么说......我知道我们可以在 .c 文件中分离实现并在 header .h 文件中声明接口(interface),但
以前我相当确定“封装字段”命令会变成如下所示: public int SomeNumber; 进入以下内容(我想要来自 VS 2015 的内容): private int someNumber; pu
在 Angular 中,默认模式是封装:ViewEncapsulation.Emulated 此模式通过使用 CSS 选择器启用样式封装。然而,'encapsulation: ViewEncapsul
正如四人帮在“Design Patterns”中所说:“it's often said that 'inheritance breaks encapsulation'”,在“面向对象编程语言中的封装和
我是一名优秀的程序员,十分优秀!