我有一个抽象类,其中包含必须由其子类实现的抽象列表 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。我有什么遗漏的吗?或者子对象根据生命周期还没有准备好?
最佳答案
只需删除 Child 类上的双重初始化即可;
private List<Item> list = new ArrayList<Item>();
至
private List<Item> list;
并且代码可以正常工作。
记住这一点 构造函数将:
- 调用 super()。
- 执行任何内联初始化和匿名 初始化 block 。
- 执行剩余的主体 构造函数。
所以当你调用super时,内联初始化还没有执行,所以list为null,然后你调用getList(),这会初始化一个列表并将Item放入其中,super完成后,内联初始化执行,因此创建一个新的空列表,最后调用 getSize() 返回 0
正如 @GhostCat 在评论中指出的,这是一个非常糟糕的模式,您应该通过直接在抽象类上创建列表的实例或将其传递到 super 构造函数中来更改它
关于Java:从父级构造函数将项目添加到子级列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302371/