我创建了一个简单的gradle Java项目来学习匕首。我有一个灯泡,它取决于一个按钮来打开或关闭自己。我正在尝试在我的主类中打印Bulb的状态。
Dagger文档指出,如果我们使用@Inject注释方法,则dagger在任何人要求时会自动注入该dep。在我的BulbFactory类中,我试图注入Bulb类,因为我不能直接在Main类中进行操作,因为它具有静态方法。 当我尝试访问Bulb类上的方法时,当我得到NPE时,请提出我在做什么错。
class Button {
public boolean getState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
private boolean state;
@Inject
Button() {
}
}
public class Bulb {
Button button;
String color;
public Bulb(Button button) {
this.button = button;
}
public void turnOn(){
button.setState(true);
}
public void turnOff(){
button.setState(false);
}
public boolean isTurnedOn(){
return button.getState();
}
}
public class BulbFactory {
@Inject Bulb bulb;
public Bulb getBulb() {
return bulb;
}
}
public class Main {
public static void main(String[] args) {
Bulb bulb = new BulbFactory().getBulb();
bulb.turnOn();
System.out.println(bulb.isTurnedOn());
}
}
plugins {
id 'java'
}
group 'com.shuklz'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
compile 'com.google.dagger:dagger:2.17'
annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
}
答案 0 :(得分:1)
在设置方面,您缺少@Inject
构造函数上的Bulb
。
import javax.inject.Inject;
public class Bulb {
Button button;
@Inject
public Bulb(Button button) {
this.button = button;
}
}
此外,您当前没有使用Dagger注入依赖项。
您可以用Dagger组件替换BulbFactory,该组件为您创建Bulb
类。有关组件的更多详细信息,请参见:https://google.github.io/dagger/api/2.14/dagger/Component.html
根据您的情况,您应该可以使用类似以下的内容。
import dagger.Component;
@Component
interface BulbComponent {
Bulb getBulb();
}
构建项目后,将生成DaggerBulbComponent
。这样,您可以调用getBulb
创建一个新的Bulb
实例。
public class Main {
public static void main(String[] args) {
BulbComponent bulbComponent = DaggerBulbComponent.builder().build();
Bulb bulb = bulbComponent.getBulb();
bulb.turnOn();
System.out.println(bulb.isTurnedOn());
}
}