java - 在构造函数中做很多坏事吗?

标签 java constructor

使所有字段final 通常是一个好主意,但有时我发现自己在构造函数中做了所有事情。最近我在构造函数中完成了一个真正所有操作的类,包括读取属性文件和访问数据库。

一方面,这就是类的用途,它封装了读取的数据,我喜欢创建完全初始化的对象。构造函数一点也不复杂,因为它委托(delegate)了大部分工作,所以看起来不错。

另一方面,感觉有点奇怪。此外,在 this talk在大约 17:58 时,有充分的理由在构造函数中没有做太多工作。我想我可以通过传递适当的假人作为构造函数参数来消除这个问题。

问题仍然存在:在构造函数中做大量工作(甚至所有工作)是否不好?

最佳答案

我认为“在构造函数中工作”还可以......

...只要你不违反Single Responsibility Principle (SRP)并坚持使用Dependency Injection (DI) .

我最近一直在问自己这个问题。我发现的反对在构造函数中工作的动机是:

  • 很难测试
    • 我见过的所有例子都是DI没有被使用。实际工作并不是构造函数的错。
  • 您可能不需要构造函数计算的所有结果,这会浪费处理时间并且很难单独进行测试。
    • 这基本上违反了SRP ,不是构造函数的错。
  • 旧的编译器在构造函数中抛出异常时遇到了问题,因此除了在构造函数中分配字段之外,您不应该做任何事情。
    • 我认为在编写新代码时考虑到编译器的历史缺陷并不是一个好主意。如果我们这样做,我们还不如取消 C++11 和所有好的东西。

我的看法是……

...如果您的构造函数需要做一些工作以使其遵守 Resource Acquisition Is Initialization (RAII)并且类(class)不违反SRPDI使用得当;然后在构造函数中工作就是 A-Okay!如果您想阻止使用初始化完全失败的类对象,而不是依赖用户检查某些返回值,您甚至可以抛出异常。

关于java - 在构造函数中做很多坏事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048515/

相关文章:

java - 谷歌地图可以用于非 GPS 相关功能,例如提供游戏 map 吗?

java - 使用 Java Stream 从一组集合中收集所有对象

数组的 C++ 构造函数初始值设定项

Java构造函数详细介绍

java - Sonar 问题 - 数组直接存储

java - 本地存在 Maven 依赖项时出现 NoClassDefFoundError

java - 如何在不使用 n 数组且不使用任何库函数的情况下反转数字?

c# - 静态类与 protected 构造函数

java - 从孙类调用父类构造函数,调用父类或祖父类构造函数?

java - 数组列表的浅拷贝