但是,不应过度使用创建静态实用程序方法?怎么避免呢?

San*_*jiv 4 java oop static


随着时间的推移,在java项目中引入了大量的实用方法,以实现更复杂,更简单的任务.

当使用静态方法时,我们在代码中引入紧耦合,这使得我们的代码更难以测试,特别是如果实用方法非常复杂.

我只是认为现在很难管理和测试这些实用程序.请指导我避免使用这些实用程序方法,以及如何组织现有项目以删除所有STATIC实用程序.

你能帮我避免静态方法吗?

Boh*_*ian 6

拥有大量静态方法没有任何问题.

静态方法是(或应该是,读取)无状态,这使它们成为最简单的测试方法 - 没有设置,只需调用它们.

你不需要嘲笑,因为没有可以处理的状态.

关于无状态,如果技术静态方法使用静态变量来存储状态,则它们可以是有状态的.如果是这种情况,从良好的设计角度来看,它们应该使用实例变量转换为实例方法来存储状态,如果需要,使用单例模式.

  • 静态,无状态方法很容易测试.但是测试使用这些静态无状态方法的代码很难,因为它们不容易被嘲笑.用可注入组件中的实例方法替换它们允许模拟组件并在测试中注入模拟. (2认同)

Jen*_*der 3

与当前可用的其他答案相矛盾:静态方法很糟糕!

它们确实引入了强耦合。是的,在某些情况下这是可以接受的。是的,您可以通过使内部使用的策略可交换来在静态方法内部进行接缝。但根据经验,静态仍然很糟糕。

回答这个问题,如何摆脱静态方法。很简单:将它们放在适当的对象上。所有的静电都消失了。我们改进了代码吗?还没有多少。如果我们更换

callToStaticMethod()
Run Code Online (Sandbox Code Playgroud)

new X().callToNoLongerStaticMethod()
Run Code Online (Sandbox Code Playgroud)

我们用构造函数调用替换了静态调用,构造函数调用本质上只是另一个静态方法。但现在你X只是另一个依赖项,所以你可以注入它:

class A{
    private final X x;
    A(X aX){
        x = aX;
    }
} 
Run Code Online (Sandbox Code Playgroud)

注意:不需要为此使用 Spring 或任何其他框架。如果您觉得它提供一个使用默认实现的构造函数。如果您是纯粹主义者,请引入 X 的接口。

A不依赖于实现的测试X变得微不足道且显而易见。X以任何方式更换都相同。

  • 好吧,去告诉 java API 设计者,他们应该删除`java.util.Collections`,`java.util.Arrays`,`java.lang.Math`,......那些认为静态方法不好的人应该被禁止使用这些:-) (3认同)