【发布时间】:2013-11-13 02:24:00
【问题描述】:
我有一个类,它有一个构造函数,其中所有参数都由 GUICE 注入。
Public class Order {
private final ClassOne classOneObj;
private final ClassTwo classTwoObj;
@Inject
public order(ClassOne classOneObj, ClassTwo classTwoObj){
this.classOneObj = classOneObj;
this.classTwoObj = classTwoObj;
}
}
现在,我想再添加一个无法注入的字段(例如,int status)变量。
先用所有注入的参数创建一个对象,然后设置不能用setter方法注入的新字段,这是一个好习惯吗?
我想出了另一种方法,我创建了一个工厂类,如下所示:
public class OrderFactory {
private final ClassOne classOneObj;
private final ClassTwo classTwoObj;
@Inject
public order(ClassOne classOneObj, ClassTwo classTwoObj){
this.classOneObj = classOneObj;
this.classTwoObj = classTwoObj;
}
//getter methods for all the above variables
public ClassOne getclassOneObj(){
return classOneObj;
}
....
public Order createOrder(int status) {
return new Order(status, classOneObj, classTwoObj);
}
}
那么新的 Order 类会是这样的
public class Order {
int status
private final ClassOne classOneObj;
private final ClassTwo classTwoObj;
public order(int status, ClassOne classOneObj, ClassTwo classTwoObj){
this.status = status
this.classOneObj = classOneObj;
this.classTwoObj = classTwoObj;
}
//getter methods for all these member variables
}
现在要创建订单对象,我将首先创建一个 OrderFactory 对象,然后使用“createOrder”方法创建订单对象。
我最终要编写样板代码。不确定这是否是一个好习惯。如果这种方法是正确的或者有更好的方法来解决这个问题,有人可以提出建议吗?
我在 Google Guice 中阅读并发现有一个功能 @Assisted 可用于此类情况的辅助注射。但我发现这很复杂,无法说服自己是否应该在我的情况下这样做。
提前感谢您的任何建议或指导。
【问题讨论】:
-
与 iluxa 相呼应,您对工厂的手动方法很好,尽管您可以以更短的方式使辅助注射工作。如果您想使用相同的 OrderFactory 创建许多不同的订单,我唯一要更改的手动注入是注入
Provder<ClassOne>和Provider<ClassTwo>。否则,它看起来很棒。
标签: java constructor guice code-injection