当前位置: 首页 > 面试题库 >

开闭原理和Java“最终”修饰符

谯乐池
2023-03-14
问题内容

开闭原则指出:“软件实体(类,模块,功能等)应为扩展而开放,而为修改而封闭”。

但是,约书亚·布洛赫(Joshua
Bloch)在其著名的著作《有效的Java》中给出了以下建议:“设计和文档化继承,否则禁止继承”,并鼓励程序员使用“最终”修饰符禁止子类化。

我认为这两个原则显然彼此矛盾(我错了吗?)。编写代码时遵循什么原则?为什么?您是否让类保持打开状态,禁止继承其中的某些类(哪些?),或尽可能使用final修饰符?


问题答案:

坦率地说,我认为开放/封闭原则更多是过时的。从80年代和90年代开始,OO框架是基于以下原则构建的:所有事物都必须继承自别的东西,并且所有事物都应该是可子类化的。

这在MFC和Java
Swing等时代的UI框架中最为典型。在Swing中,您具有可笑的继承性,其中(iirc)按钮扩展了复选框(或相反),从而给其中一个未使用的行为(我认为是对复选框的setDisabled()调用)。他们为什么要共享血统?没什么,除了,他们有一些共同的方法。

这些天组成比继承更受青睐。Java默认情况下允许继承,而.Net采用了(更现代的)默认情况下不允许继承的方法,我认为这是正确的(并且与Josh
Bloch的原理更加一致)。

DI / IoC还为合成提供了条件。

乔什·布洛赫(Josh
Bloch)还指出,继承破坏了封装,并给出了一些很好的解释原因。还已经证明,如果通过委派而不是扩展类,则更改Java集合的行为更加一致。

就我个人而言,这些天来我在很大程度上将继承视为仅是关于继承的细节。



 类似资料:
  • 本文向大家介绍Java访问修饰符原理及代码解析,包括了Java访问修饰符原理及代码解析的使用技巧和注意事项,需要的朋友参考一下 一、概述 访问等级比较:public > protected > default > private 无论是方法还是成员变量,这四种访问权限修饰符作用都一样 public:不管包外包内,所有类(子类+非子类)均可使用 protected 包内:所有类可使用 包外:子类可使

  • 以下代码有什么问题 字符串引用名称显示编译错误-Java错误-参数名称的修饰符非法-仅允许使用final 我同意下面给出的建议,但我想了解为什么这是不允许的,尽管两者都是静态的?

  • 问题内容: Java修饰符的合理顺序是什么? 抽象 最后 本机 私人的 受保护的 上市 静态的 严格的 已同步 短暂的 易挥发的 更新资料 我已将措辞从“ 建议” 更改为“ 合理” ,以使讨论是否平静,无论是否建议使用该命令。 问题答案: Java语言规范(而不是Java虚拟机规范)中提到了修饰符的 习惯 用法顺序,例如,对于类修饰符,您将找到以下定义(摘录): [....] 如果两个或更多个(不

  • 代码: 但是我不能在不传递相关参数的情况下调用该方法:iFaculty的一个对象。但我不能这么做。有人知道如何从main方法调用adminaulfly()吗?或者以任何方式调用adminafully(),并运行代码以给出相应的输出。? 谢谢你。

  • 主要内容:final 修饰变量,final修饰方法,final修饰类,final 修饰符使用总结final 在 Java 中的意思是最终,也可以称为完结器,表示对象是最终形态的,不可改变的意思。final 应用于类、方法和变量时意义是不同的,但本质是一样的,都表示不可改变,类似 C# 里的 sealed 关键字。 使用 final 关键字声明类、变量和方法需要注意以下几点: final 用在变量的前面表示变量的值不可以改变,此时该变量可以被称为常量。 final 用在方法的前面表示方法不可以

  • 问题内容: 由多个线程访问但仅在同步块内部访问的变量是否需要volatile修饰符?如果没有,为什么? 问题答案: 您不需要在内部使用,synced已经保证了一致地使用(每次访问)时变量的本地缓存的正确行为。 适用于原始值,并且可以作为原子访问原始类型的理想捷径。请注意,在JDK 5中,volatile的行为已从1.4开始更改。 更多信息可以在这里找到