gpt4 book ai didi

java - Java 中的 OOP 和 DI

转载 作者:行者123 更新时间:2023-11-30 09:59:27 26 4
gpt4 key购买 nike

有一些基类 BaseA 带有惰性注入(inject)字段 foo(或非惰性)。

public class BaseA {
@Inject
protected Provider<BaseY> foo;

void someMethod1(){
BaseY bar = foo.get();
//...using "bar"
}
}

BaseY 类由 DerivedY 类扩展:

public class DerivedY extends BaseY{
}

基类 BaseA 由类 DerivedA 扩展。如何在 DerivedA 类中使用 DerivedY 实例?

第一个变体:

public class DerivedA extends BaseA {
@Inject
protected Provider<DerivedY> foo;

void someMethod2(){
DerivedY bar = foo.get();
//...using "bar"
}
}

但在这种情况下,例如,FindBugs 会抛出下一个违规“类定义了屏蔽父类(super class)字段的字段 (MF_CLASS_MASKS_FIELD)”。

第二个变体:

public class DerivedA extends BaseA {
void someMethod2(){
DerivedY bar = (DerivedY)foo.get();
//...using "bar"
}
}

第二个变体要求使用向下转换,这违反了 Liskov 替换原则。

在这种情况下哪种解决方案是正确的(最佳实践)?关于这个问题,您可以建议哪些文献(或链接)?

最佳答案

我建议研究 generics .这个问题的一个解决方案是通用基类。

public class BaseA<T extends BaseY> {
final Supplier<T> foo;

public BaseA(Supplier<T> foo) {
this.foo = foo;
}
}

public class DerivedA extends BaseA<DerivedY> {
public DerivedA(Supplier<DerivedY> foo) {
super(foo);
}
}

关于java - Java 中的 OOP 和 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58864011/

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