为什么封装似乎与开闭原则相矛盾?

lil*_*oka 4 java encapsulation open-closed-principle

在封装中,想法是通过将变量声明为私有来隐藏类对其变量所做的事情,从而实现了 OCP。但是,为什么要添加 getter 和 setter,然后打开变量进行修改呢?

为什么要经历将变量设置为私有的整个麻烦,然后在它们上添加公共设置器?这似乎不是很严格,这是封装的思想之一。

Mar*_*nik 5

打开您的变量进行修改

Open-Closed Principle 中,“open”这个词的意思完全不同。

这意味着源代码已关闭以进行修改,但生成的类工件对通过扩展进行的进一步修改是开放的。openclosed都不是指类的实例的任何方面。

另一方面,我和你一起从稍微不同的角度批评 getter/setter:他们添加了大量的样板,只是为了将你的整体设计恢复到与具有公共字段的类几乎相同的东西。

某些不太常见的情况下,使用 getter/setter 仍然值得。这适用于属于库的公共 API 的类,并且通常适用于通过 setter 配置的具有一些非平凡行为的任何类。

对于纯数据类,getter/setter 主要是由于拒绝与公共字段一起工作的过时框架的要求而被迫使用的。Spring、Hibernate 和 Jackson 是强制执行此操作的最先进框架的示例。

  • 确切地说,您只需要仔细阅读:关闭修改的是**类**,而不是它的**实例**。 (3认同)