Spring应用程序中的实用程序类 - 我应该使用静态方法吗?

eon*_*eon 45 java methods spring static

假设我有一个实用程序类DateUtil(见下文).要使用此方法,调用方法使用DateUtils.getDateAsString(aDate).删除静态修饰符并使DateUtil成为一个spring bean(请参阅DateUtilsBean)并将其注入调用类或者保持原样是不是更好?

我可以看到使用静态的一个缺点是关于模拟的问题,请参阅如何使用静态方法进行模拟?

public class DateUtils {

    public static String getDateAsString(Date date) {       
        String retValue =  "" // do something here using date parameter
        return retValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

春豆版

@Component
public class DateUtilsBean {

    public String getDateAsString(Date date) {      
        String retValue =  "" // do something here using date parameter
        return retValue;
    }
}
Run Code Online (Sandbox Code Playgroud)

Sea*_*oyd 30

我不这么认为.DateUtils类听起来像一个纯实用程序类,它没有任何副作用,只是处理输入参数.这种功能也可以保留在静态方法中.我不认为你很可能想要模拟日期助手方法.

  • 同意.仅仅因为_anything_ _could_被连接为Spring bean并不意味着_everything_ _should_被连接为Spring bean. (7认同)
  • 如果静态方法读取驱动我的应用程序的配置文件怎么办?我很可能想要嘲笑这种行为.想一想:你想做功能测试,但你不想成为一个"配置工厂".如果它是一个单身,那么我可以更容易地模拟该方法并从代码中驱动我的测试.但是,PowerMock也可以模拟静态方法. (5认同)
  • 它可能是过度工程,但使它成为一个可以注入的bean,可以更容易地对依赖类进行单元测试.如果它实现了接口,它将更容易测试. (4认同)

Alb*_*ven 14

我同意肖恩帕特里克弗洛伊德.

这是我的标准:如果类的方法只对它们接收的参数做事,没有外部依赖(数据库,文件系统,用户配置,其他对象/ bean等),那么我会用静态方法做,通常在带有私有构造函数的final类中.

否则,我将使用Spring bean实现它.

所以,在你提出的情况下,根据这个标准,我会用静态方法编写一个类.

问候.


Mr.*_*art 11

最好将它声明为Spring bean,因为它的生命周期然后由Spring管理,你最终可以注入依赖项,汇集对象,以及以适当的方式测试它,而不是说你可以将它用作常规对象并将其作为参数传递,在子类中重新定义方法...等.

简而言之,是的,在大多数情况下它会是一个更好的设计.然而,在暴露的简单情况下,它没有很大的区别.