我有一个带有抽象列表getter / setter的抽象类,必须由其子元素实现。如何将项目添加到从父级调用getter的子类?
以下是我的示例代码:
1)抽象类
import java.util.List;
public abstract class AbstractParent<T> {
public abstract List<T> getList();
public abstract void setList(List<T> list);
public AbstractParent(T item) {
getList().add(item);
}
}
2)实施
import java.util.ArrayList;
import java.util.List;
public class Child extends AbstractParent<Item> {
private List<Item> list = new ArrayList<Item>();
public Child() {
super(new Item());
}
@Override
public List<Item> getList() {
if (this.list == null)
list = new ArrayList<Item>();
return this.list;
}
@Override
public void setList(List<Item> list) {
this.list = list;
}
public static void main(String[] args) {
Child c = new Child();
System.out.println(c.getList().size());
}
}
3)项目
public class Item {
public Item() {
}
}
System.out.println行的输出(c.getList()。size());尽管我在AbstractParent构造函数(#1)中添加了一个要列出的项,但(#2)始终为0。有什么我想念的吗?或者根据生命周期没有准备好子对象?
答案 0 :(得分:1)
只需删除Child类的双初始化;
private List<Item> list = new ArrayList<Item>();
到
private List<Item> list;
并且代码可以正常工作。
请记住 构造函数将:
所以当你调用super时,内联初始化还没有执行,所以列表为null,然后你调用getList()并初始化一个列表并将Item放入其中,在super完成之后,进行初始化执行以便创建一个新的空列表,最后调用返回0的getSize()
正如@GhostCat在评论中指出这是一个非常糟糕的模式,您应该通过直接在抽象类上创建列表实例或在超级构造函数中传递它来更改它