gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:40:26 25 4
gpt4 key购买 nike

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

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

这是 A 的简化 View :

public class A {

int value1;
List<SpecialItem> itemList;

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

现在,这是 B 的简化 View :

public class B {

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

public SampleClass(int value1) {
???
}

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

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

我的目标是:

  1. 不要给启动 A 实例的机会给定的项目列表。
  2. 有一个 B 的构造函数,它不提供 itemList,而是创建我想要的 itemList 并将其“种植”在 B 中。例如,该列表将只有一个由以下方法创建的 SpecialItem 类型的对象我给它的参数。

我的一件事是为 A 创建一个不带 itemList 的私有(private)/包可见性构造函数,然后将其用作“ super ”,但我不确定这是否是最佳解决方案。

希望得到您的想法和反馈,

谢谢。

最佳答案

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

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的第二个构造函数委托(delegate)给第一个,后者又调用父类(super class) A 的构造函数。都是 B 的第一个构造函数和 A 的构造函数需要 List<SpecialItem>作为它的第二个参数。为此,我们使用 DEFAULT_ITEM_LIST ,它被定义为 private static final B 中的成员.

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

关于Java - 具有预定义继承值的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44445508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com