有很多人反对使用“公共/私有”静态方法。我四处寻找,没有运气,并试图找到任何提倡善用静态方法的人。
假设方法总是有凝聚力的,在哪里可以使用公共静态方法?这些方法在 Java 和 .NET 之间是否有所不同(也就是在一种方法中比另一种更容易接受)?
最近的这篇SO帖子激起了我对这个话题的愤怒/兴趣。
有很多人反对使用“公共/私有”静态方法。我四处寻找,没有运气,并试图找到任何提倡善用静态方法的人。
假设方法总是有凝聚力的,在哪里可以使用公共静态方法?这些方法在 Java 和 .NET 之间是否有所不同(也就是在一种方法中比另一种更容易接受)?
最近的这篇SO帖子激起了我对这个话题的愤怒/兴趣。
如果方法可以被视为一个单元,并且可以单独进行有效测试,请使用公共静态方法。在使用静态方法的类型上实现依赖注入或模拟是很困难的。
我将静态方法用于具有很少/没有依赖关系以及定义明确的输入/输出的实用程序方法。
静态方法通常不应该:
相反,纯函数(即没有副作用)是好的静态方法。
当然,这不应被视为绝对的教条。
我想说在简单的工厂中使用它们是公平的,比如返回包含静态方法的类型的场景。说如果:
string.Empty;
那么是合法的静态属性:
string.GenerateRandomString();
是合法的静态方法。然而即便如此,我也可以看到纯 OO 程序员可能更喜欢 StringFactory 或 RandomStringGenerator 类,但我想这完全取决于你在哪里画线。
静态方法与全局对象实例上的实例方法具有相同的语义。除非您对全局对象实例很熟悉,否则您不应该使用静态方法。也就是说,这在很大程度上取决于情况。有时,一个讨厌的黑客是正确的做法。
将方法标记为静态告诉消费者您不会更改传递给该方法的任何对象的状态。静态方法应该对其传递的参数执行操作,并且不应该依赖任何内部字段。
我相信您引用的帖子中给出的具体建议与静态方法所在的位置有关 - 而不是反对使用静态方法的建议。
一种典型的用途是实现单例模式。