4

我不得不问这个问题,因为我觉得只有有经验的程序员才能知道一个类中静态成员的优缺点。我读过解释静态成员的书籍,根据我的观点,我还在我的项目中使用了许多静态成员。

据我了解,如果某个类在我的项目中只使用了 1 次,我的意思是不需要创建一些或多个实例,我应该将其所有成员设为静态,尤其是静态方法。这是真的?这还有另一个好处,因为调用静态成员可以很容易地完成,而无需创建新实例或在我们的类之间传递实例。

在我的项目中使用静态成员并没有告诉我它有什么问题,我的项目似乎运行正常,当然我并不是说我喜欢使用静态成员并经常随机使用它(正如我在上面解释的观点)。我认为静态成员(我不知道)可能有一些优点和缺点,我想从你的经验中知道。请与我分享。
谢谢!

4

4 回答 4

4

据我了解,如果某个类在我的项目中只使用了 1 次,我的意思是不需要创建一些或多个实例,我应该将其所有成员设为静态,尤其是静态方法。这是真的?

它可以是——有时你想要一个实例,它不能是静态的,因为它实现了一个接口——在这种情况下,你会使用单例模式。

静态方法可能很有用,如果您的类不包含状态,那么作为静态类的可能性应该没问题。

于 2013-04-18T23:18:00.377 回答
4

查看以下帖子:

据我了解,如果某个类在我的项目中只使用了 1 次,我的意思是不需要创建一些或多个实例,我应该将其所有成员设为静态,尤其是静态方法。这是真的?

这取决于。我相信如果您想在整个应用程序中全局访问它们(即实用程序类、辅助函数等),静态类是很好的。

使用静态类来包含与特定对象无关的方法。例如,创建一组不作用于实例数据并且不与代码中的特定对象关联的方法是一个常见的要求。您可以使用静态类来保存这些方法。

请记住,声明一个静态类允许它在应用程序的生命周期内保留在内存中。这意味着如果静态类只使用一次,即使不再需要/将再次使用,它仍将保留在内存中。相反,如果该类只使用一次,您最好创建一个常规类实例,以便在您使用完之后 GC 会进行清理。

于 2013-04-18T23:28:45.180 回答
3

我对静态的主要问题是它使得多态性变得非常困难(在运行时用另一件事替换一件事)。您经常想要这样做的地方是在编写测​​试时,我想用 MockFileManager 替换 FileManager 类。如果我使用的是非静态类,我只是使用接口来实现多态性,希望我使用的是 IoC 模式,并且我可以传入我的模拟实现来代替真实的实现(是的多态性!)。

但是,如果我的 FileManager 类都是静态的,则很难用其他动态替换它。

注意:有代码分析规则告诉您出于性能原因将事物设为静态。我关闭了这些规则。

于 2013-04-18T23:22:34.260 回答
2

引用比我能解释得更好的人的话

滥用静态类可以被认为是不好的做法。但是滥用任何语言功能也是如此。

我没有区分只有静态方法的非静态类和静态类。它们实际上是同一件事,除了静态类允许编译器强制执行开发人员的意图(不实例化此类,访问其功能的方便语法等)。

“Helper”类的泛滥可能会给您带来麻烦(设计、可维护性、可读性、可发现性、其他能力……)。这里没有争论。但是你能说“帮助者”类是不合适的吗?我对此表示怀疑。

事实上,负责任地使用静态类可以为您的代码带来巨大的好处:

Enumerable 静态类提供了一组我们大多数人都喜欢的扩展方法。它们是一组逻辑功能/业务逻辑,与任何特定类型的实例无关。环境/上下文提供的服务:例如日志记录、配置(有时) 其他(我现在想不到 :))所以不,一般来说它不是坏习惯。只要明智地使用它们...

至于我自己,当我需要使用它们时,我会使用它们,这是否看起来是一种不好的做法并不重要。

经验法则?如果您知道为什么应该使用静态并且可以解释它,那么您应该使用它。

于 2013-04-18T23:25:34.743 回答