gpt4 book ai didi

java - 这个 Guice 示例发生了什么?

转载 作者:行者123 更新时间:2023-11-30 03:49:24 25 4
gpt4 key购买 nike

我有以下代码示例。

public interface Calculator {
public int compute(int a);
}

public class Adder implements Calculator {
private int n = 0;

@Override public int compute(int a) {
int result = a + n;
++n;
return result;
}
}

public class X {@Inject public void run(Calculator c) {
System.out.println(c.compute(500));
}
}
public class FirstModule extends AbstractModule {@Override protected void configure() {
bind(Calculator.class).to(Adder.class);
}
}

public static void main(String[] args) {
Injector inj = Guice.createInjector(new FirstModule());
X x1 = inj.getInstance(X.class);
x1.run(inj.getInstance(Calculator.class));
X x2 = inj.getInstance(X.class);
x2.run(inj.getInstance(Calculator.class));
System.out.println(x1 == x2);
}

我期望的输出是:

500
500
False

相反,它是:

500
500
500
500
False

看起来实例化行(如X x1 = inj.getInstance(X.class);)执行run()方法。这是为什么?

最佳答案

@Inject 将执行您指定的构造函数/方法。正确的使用方法是使用构造函数注入(inject) Calc 实例。

    interface Calculator
{
public int compute(int a);
}

class Adder implements Calculator
{
private int n = 0;

@Override
public int compute(int a)
{
int result = a + n;
++n;
return result;
}
}

class X
{
private Calculator c;

@Inject
public X(Calculator c)
{
this.c = c;
}

public void run(Calculator c)
{
System.out.println(c.compute(500));
}
}
class FirstModule extends AbstractModule
{
@Override
protected void configure()
{
bind(Calculator.class).to(Adder.class);
}
}

public static void main(String[] args)
{
Injector inj = Guice.createInjector(new FirstModule());
X x1 = inj.getInstance(X.class);
x1.run(inj.getInstance(Calculator.class));
X x2 = inj.getInstance(X.class);
x2.run(inj.getInstance(Calculator.class));
System.out.println(x1 == x2);
}

输出:

500500错误

关于java - 这个 Guice 示例发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24800199/

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