【发布时间】:2019-03-04 05:08:50
【问题描述】:
编辑:这个问题真的应该围绕 Lombok 和 Guice 而不是 vanilla java 继承。
我正在尝试使用 Lombok 和 Guice 注入实现 Java 继承链,它的工作原理如下:
第一类
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 中有 5 个属性)。有没有办法混合搭配 lombok 的注释(@NoArgsConstructor、@AllArgsConstructor 等)来完成这项工作?
谢谢。
【问题讨论】:
-
您的抽象类即使有公共构造函数也不能直接实例化,因为它们被声明为抽象的。如果您愿意,可以将构造函数设为
protected以表明它们仅可用于子类。 -
显示的代码不会产生你提到的错误,因为它有一个默认的构造函数。
-
感谢@khelwood,对
abstract类无法真正实例化,但为什么Java 编译器没有捕捉到这一点并停止抱怨没有构造函数? -
这是您的完整代码吗?正如马克已经说过,您发布的内容不应导致错误(可能是警告),因为如果不存在其他构造函数,编译器将添加一个空构造函数。
-
抽象类无法实例化,但由于子类构造函数中隐式调用
super(),它们仍然需要构造函数。
标签: java inheritance dependency-injection guice lombok