java - 我们应该避免在不必要的时候使用 spring managed bean 吗?

标签 java spring refactoring mockito static-methods

假设我有一个相对复杂的类,需要通过分成几个较小的辅助类来简化它。一种建议的重构解决方案是:

public class RefactoredComplexClass {
    private final Helper1 h1;
    private final Helper2 h2;
    // Helper1 and Helper2 will be injected by spring IoC
    public RefactoredComplexClass(Helper1 h1, Helper2 h2) {
        this.h1 = h1; this.h2 = h2;
    }
} 
public class Helper1 {// no state class
    public int add(int x, int y) { return x + y ; }
}

上述建议背后的原因主要是为了简化基于 mockito 的测试。

我的问题是: 1. 对于那些没有状态的辅助类,应该使用静态方法而不是实例方法吗? 2.注入(inject)那些Helper对象是个好主意吗?

我自己的想法是应该使用静态方法,因为没有状态需要维护那些辅助类/方法。并且不需要注入(inject)那些辅助类的实例。但我确实同意上述解决方案在某种程度上使基于 mockito 的测试更容易,因为静态方法很难模拟。

有什么建议吗?

最佳答案

看看你的例子,静态方法似乎是可行的方法,也就是说,如果你确定辅助类是绝对无状态的,并且你可以很好地测试静态方法,那么这些类中的所有方法都是一堆实用方法。 (例如 java.lang.Math)

静态方法的几个注意事项:
1)静态绑定(bind)和更好的性能。 2) 没有创建对象。 3)方法不能被覆盖 4)难以模拟 5) 提前初始化

基于 Spring 的单例的注意事项(无状态助手最好是单例并注入(inject)到你的类中)
1)你至少有一个对象——你受益于继承、多态等 2)可以延迟加载 3)易于模拟测试

你可以阅读这个 useful article

关于java - 我们应该避免在不必要的时候使用 spring managed bean 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28844414/

相关文章:

Java8 : Why is it forbidden to define a default method for a method from java. lang.Object

java - 组织.postgresql.util.PSQLException : ERROR: null value in column "category_id" violates not-null constraint

java - 为什么我看不到我的网站,也看不到 HTTP 状态 404?

ruby - 如何重构 ruby​​ 代码?

java - 当你运行 mvn install 时到底会发生什么?

java - 解析 HH :mm:ss and H:mm:ss for LocalTime using single DateTimeFormatter in java8

javascript - 从 JavaScript OOP 中的经典事件管理转向事件委托(delegate)

python - pickle/zodb : how to handle moving . 带有类定义的 py 文件?

java - Jsf 应用程序和 polymer Web 组件

java - 如何在运行多个服务时只获取一个 Redis 事件?