我想声明一个抽象类,它有一个要在其子类中初始化的变量。例如,假设我们有一个名为Country的抽象类,以及一个名为United States的子类。 (我知道,通常你会让美国成为Country的一个实例,但我只是以此为例,让我们假设这是我们想要的设计。)我想要一个public final Set<String>
调用bigCities在国家宣布但未初始化,但将在美国初始化为{“纽约”,“洛杉矶”,“芝加哥”}。我该如何做到这一点?
(如果之前有人问我,我很抱歉,但我的问题很难制定出精确的搜索条件。每当我尝试在Google或StackOverflow上搜索时,我都会遇到类似但不是我的问题我正在寻找。)
答案 0 :(得分:3)
如果您要将自己的属性bigCities
定义为final
,则必须在类的构造函数中对其进行初始化,例如Country
或UnitedStates
。< / p>
public abstract class Country {
public final Set<String> bigCities;
public Country(Set<String> bigCities) {
this.bigCities = bigCities;
}
}
在这种情况下,Country
的子类必须使用指定的参数调用父的构造函数。
答案 1 :(得分:1)
有两种方法可以做到这一点。你可以让Country构造函数有一个名为bigCities的参数,而一个子类如UnitedStates会调用super(cities,otherArgs)。
或者,你可以制作一个像这样的抽象方法
protected abstract Set<String> getBigCities();
然后在Country构造函数中,将bigCities设置为该方法的实现。
bigCities = getBigCities();
答案 2 :(得分:0)
abstract class Country {
public final Set<String> bigCities;
protected Country(String... bigCities) {
this.bigCities = new HashSet<String>(Arrays.asList(bigCities));
}
}
class USA extends Country {
USA() {
super("NY", "Chicago");
}
}