我应该默认推荐密封等级吗?

2024-04-05

在我工作的一个大项目中,我正在考虑建议其他程序员如果没有考虑如何对他们的类进行子类化,则始终密封他们的类。很多时候,经验不足的程序员从来不会考虑这一点。

我觉得奇怪的是,在 Java 和 C# 中,类默认是非密封/非最终的。我认为将类密封可以大大提高代码的可读性。

请注意,这是内部代码,如果发生需要子类化的罕见情况,我们随时可以更改它。

你有什么经历?我对这个想法遇到了相当大的阻力。难道人们都懒得连打字都懒得了吗?sealed?


好吧,既然很多人都已经考虑过了……

是的,我认为建议默认情况下密封类是完全合理的。

这与乔什·布洛赫 (Josh Bloch) 在他的著作中的建议相一致。出色的 book 有效的 Java,第二版 https://rads.stackoverflow.com/amzn/click/com/0321356683:

为继承而设计,或者禁止继承。

为继承而设计是hard,并且可以使您的实施less灵活,特别是如果您有虚拟方法,其中一个方法调用另一个方法。也许它们是超载的,也许不是。一个人打电话给另一个人这一事实必须记录在案否则,您无法安全地重写任一方法 - 您不知道何时会调用它,也不知道是否可以安全地调用另一个方法而不会面临堆栈溢出的风险。

现在,如果您以后想要更改哪个方法在更高版本中调用哪个方法,则不能 - 您可能会破坏子类。因此,以“灵活性”的名义,您实际上已经实现了less灵活,并且必须更仔细地记录您的实施细节。对我来说这听起来不是一个好主意。

接下来是不可变性——我喜欢不可变类型。我发现它们比可变类型更容易推理。这就是为什么乔达时间 http://joda-time.sf.netAPI 比使用更好Date and Calendar在爪哇。但未密封的类永远不可能known是一成不变的。如果我接受类型的参数Foo,我也许可以依赖这些属性声明于Foo不会随着时间的推移而改变,但我不能依赖对象本身不被修改 - 子类中可能有一个可变属性。如果该属性也被某些虚拟方法的重写所使用,请上帝帮助我。告别不变性的许多好处。 (具有讽刺意味的是,Joda Time 具有非常大的继承层次结构 - 通常会说“子类应该是不可变的。Chronology移植到 C# 时很难理解。)

最后,还有过度使用继承的问题。在可行的情况下,我个人更喜欢组合而不是继承。我喜欢接口的多态性,并且偶尔我使用实现的继承 - 但它很少适合我的经验。将类密封起来可以避免它们被不恰当地从组合更适合的地方得出。

编辑:我还想指出读者Eric Lippert 2004 年的博客文章 https://learn.microsoft.com/en-gb/archive/blogs/ericlippert/why-are-so-many-of-the-framework-classes-sealed为什么这么多框架类是密封的。我希望 .NET 在很多地方提供界面我们可以努力提高可测试性,但这是一个略有不同的要求......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该默认推荐密封等级吗? 的相关文章

  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • += 运算符在 C++ 中是如何实现的?

    这是我一直在思考的一个问题 但从未找到任何资源来说明这个问题的答案 事实上它不仅是为了 也适用于它的兄弟姐妹 即 等等 当然不是 考虑这个例子 int a 5 a 4 this will make a 9 现在考虑等效表达式 a a 4 T
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 使用 catch all 字典属性将 json 序列化为对象

    我想使用 JSON net 反序列化为对象 但将未映射的属性放入字典属性中 是否可以 例如给定 json one 1 two 2 three 3 和 C 类 public class Mapped public int One get se
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 难以理解 通配符

    我有一个非常基本的问题 下面的代码无法编译 假设 Apple Extends Fruit List
  • 如果我重新分配并且新大小为 0,会发生什么情况。这与释放等效吗?

    给出以下代码 int a NULL a calloc 1 sizeof a printf d n a a realloc a 0 printf d n a return 0 它返回 4078904 0 这个 realloc 相当于 free
  • 如果 Modelmapper 中的整个属性为空,如何排除它们

    ModelMapper 是否 http modelmapper org http modelmapper org 支持什么排除属性 如果该值为空 我刚刚找到了 PropertyMap 但这对我来说是一种限制 因为我必须描述我想要的特定属性
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • Spring 如何在运行时获取有关“强类型集合”的泛型类型信息?

    我在 Spring 3 0 文档中阅读了以下内容 强类型集合 仅限 Java 5 在 Java 5 及更高版本中 您可以使用强类型集合 使用泛型类型 也就是说 可以声明一个 Collection 类型 使其只能包含 String 元素 例如
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

    我想简化调用 Oracle 数据库的 Groovy 脚本的执行 如何将 ojdbc jar 添加到默认类路径以便我可以运行 groovy RunScript groovy 代替 groovy cp ojdbc5 jar RunScript
  • 为什么/何时应该使用泛型方法?

    学习Java的时候遇到过通用方法 public
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 如何阻止 Control-I 在 CoreWindow 范围内的 UWP 文本框中插入选项卡?

    当我在 UWP 应用程序中有一个 TextBox 时 对我来说 奇怪的行为 在 Windows 10 中创建通用的空白应用程序 UWP 应用程序 使用以下代码将文本框添加到默认网格
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • 亚马逊 Linux - 安装 openjdk-debuginfo?

    我试图使用jstack在 ec2 实例上amazon linux 所以我安装了openjdk devel包裹 sudo yum install java 1 7 0 openjdk devel x86 64 但是 jstack 引发了异常j
  • FragmentMap + ActionBar 选项卡

    我一直在尝试插入一个MapView进入一个ActionBar Tab 但我什至无法解决问题 即使谷歌搜索 这是主要活动 Override public void onCreate Bundle savedInstanceState supe
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码

随机推荐

  • 如何使用 ffmpeg-python 在视频上叠加帧序列?

    我在下面尝试过 但它只显示背景视频 background video ffmpeg input input mp4 overlay video ffmpeg input f frames folder png pattern type gl
  • 跳过多个号码

    我正在尝试将正则表达式用于我正在做的工作项目 我有一组数字 如下所示 23 14 62 121 98 0 0 0 1 0 0 0 2 165 60 00 24 13 64 118 101 0 0 0 1 0 0 0 2 165 60 00
  • VBA更改模块中的实例变量(excel)

    在 VBA 中 我需要一个模块 sub 来告诉实例设置一些变量 在模块 1 中我有 Sub Load ThisWorkbook SetupVariables ThisWorkbook TestVariables End Sub 在本工作簿中
  • 在Windows下使用通过MSYS2安装的cmake 3.5.2,缺少“MinGW Makefiles”生成器

    我正在尝试使用 MinGW 作为编译器 在 Windows 下进行 hello world 测试来制作 cmake 这个答案 https stackoverflow com a 4101496 4063051建议运行cmake与 G标志如下
  • 在 Mac OS X 中从相机捕获视频

    如何在 MacOS X 中过滤来自摄像头的视频流 我编写了 QuickTime 序列采集器通道组件 但仅当应用程序使用 SG API 时它才有效 如果应用程序使用 QTKit Capture 则该组件无法工作 有人知道我该如何实施它吗 您可
  • 如何围绕未正确发布的值演示竞争条件?

    我正在阅读 Java 并发实践 并查看第 51 页的示例代码 根据该书 这段代码如果没有正确发布 就有失败的风险 因为我喜欢编写示例代码并分解它们以证明它们是如何工作的 我尝试让它抛出 AssertionError 但失败了 引导我走向我的
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 如何在java中打开所有以特定前缀开头的文件?

    有没有办法在Java中打开以特定名称开头的目录中的某些文本文件 例如 在我的目录中 我有以下文件 Ab 01 txt Ab 02 txt Ab 03 txt Ab 04 txt SomethingElse txt NotRelated tx
  • 学说问题(映射不一致)

    我正忙于 Symfony 中的一个项目 我只是检查分析器选项卡并看到 2 个错误不断弹出 它们如下 The mappings MyBundle MainBundle Entity School provinceId and MyBundle
  • 在 netbeans 中创建/访问库

    我是新的 netbeans 用户 在导入用户创建的库时遇到问题 我创建了一个名为 MyLibrary 的库 然后 我将一个包含我保存的项目 名为 netbeansProjects 的文件夹添加到类路径中 该文件夹是我在 netbeans I
  • mysql_connect 在远程主机连接上返回“无法通过套接字连接到本地 MySQL 服务器”?

    我有一台服务器返回一个意外的间歇性错误 想知道是否有人以前经历过它或者可以猜测可能会发生什么 到目前为止我的搜索还没有结果 我以通常的方式使用 mysql connect 连接到远程 mysql 服务器 但在过去 2 周 每天几次 与数据库
  • 我应该何时以及如何使用枚举类而不是枚举?

    一位开发人员最近开始在通常适合枚举的地方使用类模式而不是枚举 相反 他使用类似于下面的内容 internal class Suit public static readonly Suit Hearts new Suit public sta
  • 如何为 keras lstm 输入重塑数据?

    我是 Keras 新手 我发现很难理解 LSTM 层输入数据的形状 Keras 文档表示输入数据应该是形状为 nb samples timesteps input dim 的 3D 张量 我有808信号 每个信号有22个通道和2000个数据
  • 是否有可能调用 WriteFile 并且应用程序将永远等待回调?

    我调用该方法win32 WriteFile然后我打电话 WaitForSingleObject handle INFINITE 与我在中使用的相同手柄WriteFile call 是否可以有某种场景让我永远等待 然后WriteFile不会完
  • 带 url-loader 的 Webpack 内联字体

    我正在尝试将一些字体内联为 base64 编码的数据 URI 但我对 Webpack 的 url loader 没有什么运气 这很奇怪 因为 url loader 似乎只是为我的图像和 svg 文件执行此操作 我的设置如下 目录结构 roo
  • IO monad 的逻辑 AND 严格性

    我正在尝试用 Haskell 编写一个简单的程序 它基本上应该并行运行两个 shell 命令 这是代码 import System Cmd import System Exit import Control Monad exitCodeTo
  • 如何在 C# 应用程序中使用代理

    我正在使用 Microsoft Visual Studio 2010 C net 4 0 我有一个网络浏览器元素 我想做的是使用代理通过 Webbrowser 元素进行导航 我怎样才能做到这一点 谢谢 浏览器控件只是 IE 的一个实例 它将
  • 刷新页面会导致 404 错误 - Angular 6

    我正在构建一个应用程序的帮助Angular6并面临路由问题 一切routes当我单击特定选项卡时正在工作 但每当我refresh当前页面 它正在抛出404错误 我在堆栈溢出上看到了很多关于这个问题的帖子 但未能克服这个问题 下面是我的 ap
  • Regionprops 与 PodczeckShapes/DIPimage 圆度问题 - Matlab

    有人可以解释一下为什么Matlab中的 圆度 是通过 4 Area pi 周长 2 计算的 而在Podczeck Shape中它是Area Pi 4 sp 2 https qiftp tudelft nl dipref FeatureSha
  • 我应该默认推荐密封等级吗?

    在我工作的一个大项目中 我正在考虑建议其他程序员如果没有考虑如何对他们的类进行子类化 则始终密封他们的类 很多时候 经验不足的程序员从来不会考虑这一点 我觉得奇怪的是 在 Java 和 C 中 类默认是非密封 非最终的 我认为将类密封可以大