【发布时间】:2014-10-26 08:35:15
【问题描述】:
我目前正在阅读有关 Java 最佳实践的信息,我发现根据 this book,我们必须优先考虑静态类而不是非静态类。我记得在 C# 最佳实践中,我们必须根据 Dennis Doomen 的 C# 3.0、4.0 和 5.0 编码指南避免这种情况:
AV1008 - 避免静态类
除了扩展方法容器之外,静态类通常会导致代码设计不良。除非您愿意使用一些非常 hacky 的工具,否则它们也很难(如果不是不可能的话)单独测试。注意如果您确实需要该静态类,请将其标记为静态,以便编译器可以阻止实例成员和实例化您的类。这使您不必创建显式的私有构造函数。
我发现这两个用于 C# answer 和 Java answer 何时使用和避免使用静态类,但只是出于好奇 - C# 和 Java 都是 OOP 语言,为什么在最佳实践中会有这么大的差异?
更新: 我无法从 Java 书中复制这么多页面,但底线是:
如果您声明的成员类不需要访问 封闭 例如,总是将静态修饰符放在其声明中,使其成为静态的 而不是一个非静态成员类。如果你省略这个修饰符,每个实例都会 对其封闭实例有一个无关的引用。存储此参考成本 时间和空间,并且可能导致封闭实例在 否则将有资格进行垃圾收集(第 6 项)。如果你曾经 需要分配一个没有封闭实例的实例,你将无法做到 因此,作为非静态成员类实例需要有一个封闭实例。 私有静态成员类的一个常见用途是表示 由它们的封闭类表示的对象。
那么仅与性能有关吗?
请注意,这个问题更多的是关于静态类和 OOP,而不是 Java 和 C# 之间的差异。
【问题讨论】:
-
那本书的作者有没有说明为什么我们应该偏爱静态类而不是非静态类?
-
我也一直在想关于 Python 的问题。Pycharm(python 的一个 ide)在我的代码中充斥着警告说方法可以设为静态,这让我发疯
-
不是此类问题的正确论坛。
-
我认为您缺少书中的上下文,您必须给出摘录形式的书来判断。
-
C#和Java中的静态类有一个根本的区别,虽然它们使用相同的关键字,但它们是不一样的概念。