1

可能重复:
Guice 在实例化对象后调用 init 方法

我已经看到它建议(特别是在 Java Concurrency in Practice 中)避免this从构造函数泄漏,特别是避免调用诸如registerListener(this)直到构造之后的东西。建议的解决方法是使用静态工厂,它首先调用构造函数,然后进行那些不受信任的外部方法调用。然后构造函数将是(包)私有的。不幸的是,Guice 明确不鼓励这种工厂方法,而且我不相信有一种方法可以在我原来的类中仍然获得自动注入的同时使用它。这感觉像是一个普遍而自然的问题。在 Guice 中是否有一种简单的方法可以做到这一点?

4

1 回答 1

1

你可以在你的 Guice 模块中使用提供者方法来做到这一点:

@Provides
Listener listener(Colaborator test, Collection<Listener> listeners) {
    Listener newListener = new Listener(test);
    listeners.register(newListener);
    return listener;
}

但是,这对您的初始化序列可能是个问题。此外,如果您有很多协作者(构造函数参数),这可能会变得很难看。

还有另一种使用类型侦听器的方法。我更喜欢上面的方法,因为你在做什么更明显。但是,有时这样会更好:Guice 在实例化对象后调用 init 方法

于 2012-12-05T09:37:09.553 回答