gpt4 book ai didi

java - Guice:注入(inject)用于实现抽象方法的参数

转载 作者:行者123 更新时间:2023-11-30 09:17:06 25 4
gpt4 key购买 nike

这是我遇到的问题的一个例子:

public interface IFoo { ... }

public abstract class Helper implements IFoo {
public Helper() { ... }

protected abstract X helperMethod();
}

public class Foo extends Helper {
private final String aaa;

@Inject
public Foo(String aaa) { this.aaa = aaa; }

@Override
X helperMethod() { doSomethingUsingWhatsInjected(aaa); }
}

问题是当我像这样将 IFoo 绑定(bind)到 Foo 时:

bind(IFoo.class).to(Foo.class).in(Singleton.class);

看起来 helperMethod()aaa 被注入(inject)之前被调用,因为我看到 aaanull 。但是,如果我不使用类 Helper 并将其所有代码直接内联到 Foo 中,guice 就不会遇到问题。

这两种方法有什么区别?为什么在我们知道从何处获取 IFoo 的实现之前调用了 helperMethod()?我们可以将 Helper 与注入(inject)一起使用吗?

最佳答案

你确定你不是在 Helper 的构造函数中调用 helperMethod 吗?您从发布的代码中省略了该部分,但它会与您看到的行为相匹配。

public class Test {
interface IFoo { }

static abstract class Helper implements IFoo {
Helper() { helperMethod(); }
abstract void helperMethod();
}

static class Foo extends Helper {
private final String aaa;

Foo(String aaa) { this.aaa = aaa; }

@Override
void helperMethod() { System.out.println(String.valueOf(aaa)); }
}

public static void main(String[] args) {
// Call helperMethod twice:
// once in the Helper.Helper(), once right here.
new Foo("expected").helperMethod();
// output:
// null
// expected
}
}

Foo 做的第一件事是隐式调用它的父类(super class)构造函数,就好像你输入了 super();这必然作为子类构造函数中的第一条语句发生。因此,这种情况甚至发生在像 aaa 这样的最终变量被设置之前,因此您在 Foo 中重写的方法将 aaa 视为 null。在我的例子中,这不是特定于 Guice,但 Guice 注入(inject)可以像其他任何东西一样触发构造函数。

This StackOverflow answer对这个问题进行了更彻底的讨论。

关于java - Guice:注入(inject)用于实现抽象方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com