Java:从父级构造函数将项目添加到子级列表

标签 java

我有一个抽象类,其中包含必须由其子类实现的抽象列表 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;

并且代码可以正常工作。

记住这一点 构造函数将:

  1. 调用 super()。
  2. 执行任何内联初始化和匿名 初始化 block 。
  3. 执行剩余的主体 构造函数。

所以当你调用super时,内联初始化还没有执行,所以list为null,然后你调用getList(),这会初始化一个列表并将Item放入其中,super完成后,内联初始化执行,因此创建一个新的空列表,最后调用 getSize() 返回 0

正如 @GhostCat 在评论中指出的,这是一个非常糟糕的模式,您应该通过直接在抽象类上创建列表的实例或将其传递到 super 构造函数中来更改它

关于Java:从父级构造函数将项目添加到子级列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302371/

相关文章:

java - 将 JSON 反序列化为 Java 对象时,如何将父属性映射到子对象?

java - iOS MDM 注册 SCEP 规范和 PKIOperation 和操作=PKIOperation &message=MMIC

java - 在 Kotlin 数据类中调用父类(super class)构造函数之前的访问函数

java - 嵌入式 OSGi 或应用程序包

java - 将十六进制字节数组转换为 int

java - 显示和操作更新的图像

java - SEAM:如何在动态加载的类中获取EntityManager和Logger?

java - 长按 TextView 提示时应用程序崩溃

java - 在 String 中的特定位置查找模式并将其替换为 Java 中的其他内容

java - 您必须首先使用 AlertView 在 child 的 parent 上调用 removeView()