我有一个类,它有一个构造函数,其中所有参数都由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”方法创建Order对象。
我最终编写了样板代码。不确定这是不是一个好习惯。如果这种方法是正确的,或者有更好的方法解决这个问题,有人可以建议吗?
我在Google Guice中读到并发现有一个@Assisted功能用于辅助注射此类病例。但我发现这很复杂,无法说服自己,在我的情况下是否应该采用这种方式。
提前感谢任何建议或指导。
答案 0 :(得分:4)
您的工厂方法非常好。请不要使用setter:如果字段可以变为不可变,则它应该是不可变的,无论它是否使实例化“方便”。
您可以采用的另一种方法是Assisted Injection,它可以解决这个问题。有了它,你只需要定义工厂界面,它的实现由Guice神奇地给你:
class Order {
interface Factory {
Order create(Status status);
}
@AssistedInject Order(
ClassOne one,
ClassTwo two,
@Assisted Status status) {
}
}
模块代码:
bind(Order.Factory.class).toProvider(
FactoryProvider.newFactory(Order.Factory.class, Order.class));
然后客户端注入Factory
并像使用它一样使用它。
答案 1 :(得分:-1)
您通常会注入需要花费一些精力来构建的东西。如果你只是注入一个int字段,你最好只是在对象上调用一个setter方法(它注入了一些更复杂的依赖项)。此外,如果字段频繁更改(如“状态”字段所暗示的那样),那么它也不适合注入。