Java Dagger基本示例NPE

时间:2018-09-17 06:40:07

标签: java dagger-2

我创建了一个简单的gradle Java项目来学习匕首。我有一个灯泡,它取决于一个按钮来打开或关闭自己。我正在尝试在我的主类中打印Bulb的状态。

Dagger文档指出,如果我们使用@Inject注释方法,则dagger在任何人要求时会自动注入该dep。在我的BulbFactory类中,我试图注入Bulb类,因为我不能直接在Main类中进行操作,因为它具有静态方法。 当我尝试访问Bulb类上的方法时,当我得到NPE时,请提出我在做什么错。

Button.java

class Button {
    public boolean getState() {
        return state;
    }

    public void setState(boolean state) {
        this.state = state;
    }

    private boolean state;

    @Inject
    Button() {
    }
}

Bulb.java

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();
    }


}

BulbFactory.java

public class BulbFactory {
    @Inject Bulb bulb;

    public Bulb getBulb() {
        return bulb;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Bulb bulb = new BulbFactory().getBulb();
        bulb.turnOn();
        System.out.println(bulb.isTurnedOn());
    }
}

Build.gradle

    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'
}

https://github.com/theshuklz/learning-dagger

1 个答案:

答案 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());
    }
}