首页 > 解决方案 > 带有 Lombok 和 Guice 注入的 Java 链继承

问题描述

编辑:这个问题真的应该围绕 Lombok 和 Guice 而不是 vanilla java 继承。

我正在尝试使用 Lombok 和 Guice 注入实现 Java 继承链,它的工作原理如下:

1级

public abstract class Animal { 
    @NonNull protected String attr1;
    protected abstract void method1();

    void method0() {
        // Some code that uses attr1
    }
}

2 级

public abstract class Mammal extends Animal { 
    @NonNull protected String attr2;
    protected abstract void method2();

    @Override 
    void method1() {
        // some logic that uses attr2
        method2();
    }
}

3 级

public class Wolf extends Mammal { 
    @Inject @NonNull private String attr1;
    @Inject @NonNull private String attr2;
    @Inject @NonNull private String attr3;

    @Override 
    void method2() {
        // some logic
    }
}

main程序中,我有调用wolf.method1(). 这里的问题是只有wolf所有需要的属性(由于 Guice 注入),而其中的所有字段Animal都是未定义的。我怀疑我可能可以在 Vanilla Java 中做到这一点,但是事情会变得非常混乱(我在Animal类中有 6 个属性,在Mammal. 有没有办法混合搭配 lombok 的注释(@NoArgsConstructor、@AllArgsConstructor 等)来完成这项工作?

谢谢。

标签: javainheritancedependency-injectionguicelombok

解决方案


即使您添加了公共构造函数,您的抽象类也不能直接实例化,因为它们被声明为抽象的。如果您愿意,可以使构造函数protected指示它们仅可用于子类。

没错,抽象类不能真正被实例化,但是为什么 Java 编译器没有捕捉到这一点并停止抱怨没有构造函数呢?

您编写的任何没有显式构造函数的类都有一个隐式的无参数构造函数。任何隐式无参数构造函数都会隐式调用其超类的无参数构造函数,即使该超类是抽象的。因此,如果链上的某个类没有无参数构造函数(因为您明确地给了它另一个构造函数),那么您的代码将无法编译。

在您在问题中提供的代码中,没有显式构造函数,因此每个类都有一个隐式的无参数构造函数。在您的实际代码中,大概您已经在某处编写了构造函数,这就是未添加隐式无参数构造函数的原因。


推荐阅读