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

时间:2018-03-15 14:41:14

标签: 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。有什么我想念的吗?或者根据生命周期没有准备好子对象?

1 个答案:

答案 0 :(得分:1)

只需删除Child类的双初始化;

private List<Item> list = new ArrayList<Item>();

private List<Item> list;

并且代码可以正常工作。

请记住 构造函数将:

  1. 调用super()。
  2. 执行任何内联初始化和匿名 初始化块。
  3. 执行剩余的身体 构造
  4. 所以当你调用super时,内联初始化还没有执行,所以列表为null,然后你调用getList()并初始化一个列表并将Item放入其中,在super完成之后,进行初始化执行以便创建一个新的空列表,最后调用返回0的getSize()

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