Java - 具有预定义继承值的构造函数

时间:2017-06-08 21:01:47

标签: java inheritance constructor

为了使我的问题更清楚,我简化了名称和值,因为我的代码很长,并且有很多变量和方法。 这个问题完全等于我的问题:

我正在尝试创建一个具有两个构造函数的类B,并继承另一个名为A的类。

这是A:

的简化视图
public class A {

    int value1;
    List<SpecialItem> itemList;

    public SampleClass(int value1, List<SpecialItem> itemList) {
        this.value1 = value1;
        this.itemList = itemList;
    }

现在,这是B的简化视图:

public class B {

    public SampleClass(int value1, List<SpecialItem> itemList) {
        super(value1,itemList);
    }

    public SampleClass(int value1) {
        ???
    }

现在,问题是我想为B(其中???是)创建第二个构造函数,它不接收预定义的itemList,但创建自己的列表。 (对象SpecialItem是项目的同一个包中的另一个类)。

当然,我在定义构造函数时遇到问题,因为它不适用于A的构造函数。

我的目标是:

  1. 没有机会在没有A的情况下发起A的实例 给出itemList。
  2. 有一个B的构造函数,它没有给出itemList,而是创建了我想要的那个并在B中“植入”它。例如 - 该列表将只有一个由SpecialItem创建的对象我给它的参数。
  3. 我要做的一件事是为没有itemList的A创建私有/包可见性构造函数,然后将其用作“超级”,但我不确定它是否是最佳解决方案。

    会喜欢你的想法和反馈,

    感谢。

1 个答案:

答案 0 :(得分:1)

您似乎需要将默认列表传递给超类的构造函数。我会这样做:

public class B {

    private static final List<SpecialItem> DEFAULT_ITEM_LIST = 
        new ArrayList<>(Arrays.asList(new SpecialItem()));

    public SampleClass(int value1, List<SpecialItem> itemList) {
        super(value1, itemList);
    }

    public SampleClass(int value1) {
        this(value1, DEFAULT_ITEM_LIST);
    }
}

B的第二个构造函数委托给第一个构造函数,后者又调用超类A的构造函数。 B的第一个构造函数和A的构造函数都需要List<SpecialItem>作为其第二个参数。为此,我们使用的DEFAULT_ITEM_LIST已在private static final中定义为B成员。

请注意,我已使用new ArrayList<>(Arrays.asList(...))而非Arrays.asList(...)。这是因为Arrays.asList返回的列表不能在结构上进行修改(元素不能添加到其中或从中删除,尽管它们可以被其他元素替换)。接收另一个ArrayList的{​​{1}}构造函数允许从另一个列表中创建一个公共的,可变的List