我正在学习Java最佳实践,根据这本书的说法,我们应该静态类优于非静态类。我记得在C#最佳实践中,根据Dennis Doomen的《Coding Guidelines for C# 3.0、4.0和5.0》指南,我们必须避免使用静态类:
我在C#的答案和Java的答案中找到了关于何时使用和避免静态类的解释,但只是出于好奇——C#和Java都是面向对象的语言,为什么最佳实践存在如此大的差异呢? 更新: 我无法在这里复制太多Java书页,但底线是:AV1008 - 避免使用静态类
除了扩展方法容器之外,静态类经常导致设计不良的代码。除非您愿意使用一些非常糟糕的工具进行测试,否则它们也很难甚至不可能单独测试。请注意如果您确实需要那个静态类,请将其标记为静态类,以便编译器可以防止实例成员和实例化您的类。这使您免于创建显式私有构造函数。
所以这只是关于性能问题吗? 请注意,这个问题更多的是关于静态类和面向对象编程,而不是Java和C#之间的区别。如果声明不需要访问封闭实例的成员类,则始终在其声明中放置static修饰符,使其成为静态而非非静态成员类。如果省略此修饰符,则每个实例将拥有一个对其封闭实例的额外引用。存储此引用会耗费时间和空间,并且可能导致保留封闭实例,而当它本来应该被垃圾回收时(第6项)。如果您曾经需要分配没有封闭实例的实例,那么您将无法这样做,因为要求非静态成员类实例具有封闭实例。私有静态成员类的常见用途是表示其封闭类所表示的对象的组件。