【发布时间】:2016-08-12 14:41:56
【问题描述】:
目前我需要写SecondClass,并决定使用这种解决方案来写,否则它就无法测试。
@Component
public class FirstClass {
public void doStuff() {
System.out.println("First Class stuff!");
}
}
@Component
public class SecondClass {
private final Random random;
private final FirstClass firstClass;
@Autowired
public SecondClass(FirstClass firstClass) {
this(new Random(), firstClass);
}
public SecondClass(Random random, FirstClass firstClass) {
this.random = random;
this.firstClass = firstClass;
}
public void doOtherStuff() {
firstClass.doStuff();
System.out.println("Second Class stuff " + random.nextInt(10));
}
}
我的同事不喜欢我的解决方法,他们更喜欢这样实现SecondClass:
@Component
public class SecondClass {
private Random random;
private final FirstClass firstClass;
@Autowired
public SecondClass(FirstClass firstClass) {
this.random = new Random();
this.firstClass = firstClass;
}
public void doOtherStuff() {
firstClass.doStuff();
System.out.println("Second Class stuff " + random.nextInt(10));
}
public void setRandom(Random random) {
this.random = random;
}
}
我不同意这种解决方案,因为我认为 Random 是此类的必要部分,它不会在运行时更改,并且 setter 仅用于测试目的,这就是为什么我更喜欢两个解决方案构造函数。
我们也想出了这种构造函数:
@Autowired(required = false)
public SecondClass(FirstClasss firstClass, Random random) {
this.random = (random == null ? new Random() : random)
...
}
但实际上在构造函数中注入了更多组件,因此如果所有组件都需要,那将是更可取的。
我想知道这里有没有人有过这种经历?您如何看待这个案例以及是否有更好的方法来解决这个问题?
【问题讨论】:
-
在我的工作经验中,我使用了很多多个构造函数,并且
final字段是强制性的(显然有理由这样做) -
@PaoloForgia 您能否告诉我们更多有关您遇到问题的经历以及这种多个构造函数何时真正有帮助的经历。
-
这在我看来像是 XY 问题 (xyproblem.info)。您只想添加第二个构造函数吗?或者您是否试图通过添加此构造函数来解决其他问题?也许您想测试
SecondClass并且您需要Random生成一些常量值以便能够在测试中处理它们?
标签: java spring oop spring-boot