3

Total Guice noob here,阅读了几篇文章并观看了介绍视频,仅此而已。

这是我试图“guicifiy”的简化旧代码。不能完全弄清楚如何,因为(据我所知),我只能@inject- 注释两个构造函数之一?调用类如何创建一个或另一个实例?还是我必须以某种方式重构它?

public class MyDialog extends JDialog {
    public MyDialog( JFrame parent, <other parameters...> ) {
        super( parent );
    }

    public MyDialog( JDialog parent, <other parameters...>) {
        super( parent );
    }
 }
4

3 回答 3

4

您只能注入一个 ctor。

根据此类的使用方式,您可以:

  • 使用两种“新”方法将工厂注入到客户端代码中。
  • 将所有参数滚动到一个 ctor 中,并在不需要时传递 null。

调用类如何创建一个或另一个实例?

这表明调用类将需要多个 MyDialog 实例?然后您需要使用手动工厂(如果您只有一个 ctor,Assisted Inject 可以为您处理)。我不知道你在做什么的细节,我可能会重复你已经知道的,但作为一个空白的声明,我建议也从 MyDialog 中提取一个接口并让工厂返回它们。这样你就可以在测试中伪造 MyDialog 。

于 2009-12-04T11:47:20.977 回答
2

构造函数注入非常干净。mlk 是对的,说您只能注入一个构造函数。

你可以做的是使用方法注入:

public class Smt {

    private int a;
    private Cereal cereal;
    private Personality personality;
    private ignition;

    public Smt() {
        this.a = 5;
    }

    public Smt(int a) {
        this.a = a;
    }

    @Inject
    public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality,
        Ignition ignition) {
        this.cereal = cereal;
        this.personality = personality;
        this.ignition = ignition;
    }
}

Guice 将做的是调用你的类的setup类方法并提供所有注入。然后你做与构造函数相同的事情——将对象分配给你的类的属性。

于 2009-12-15T11:04:20.607 回答
1

我同意前面的评论。只是一个额外的提示:构造函数注入应该提供类所需的所有依赖项。正如 mlk 所说,一种方法可能是用大多数参数注释构造函数,然后通过在需要的地方传递空值来重构另一个以调用前者。
此外,Guice 3.0 支持所谓的构造函数绑定,它允许程序员指定要使用的构造函数。有关更多详细信息,请参见此处

于 2012-08-23T08:14:12.843 回答