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