假设我有一个CityDistrict
类,如下所示:
class CityDistrict {
List<House> houses;
...
}
假设对于某些用例,
ArrayList
将更适合houses
,例如有时适合LinkedList
。您如何在创建时告诉CityDistrict应该为houses
使用的类我的三个想法是:
1)这是参数类的用例吗?就像是
class CityDistrict<T> {
T<House> houses;
...
}
然后,您可以创建一个
CityDistrict<ArrayList>
。但是我想这里丢失了T应该是List
类型的信息。2)或者您可以创建多个构造函数或静态工厂方法(例如
generateArrayListCityDistrict
),但是我认为这很丑陋。3)在构造函数
CityDistrict(int ListFlag)
中使用某种标记变量,并将1
映射到ArrayList
,依此类推。我觉得也很丑。我在这里想念明显吗?什么是处理这种情况的干净且面向对象的方法?
最佳答案
您可以将Supplier<List<House>>
传递给构造函数。它将决定实例应使用哪种实现:
class CityDistrict {
List<House> houses;
public CityDistrict(Supplier<List<House>> implementation) {
houses = implementation.get();
}
public static void main(String[] args) {
CityDistrict arrayListImpl = new CityDistrict(ArrayList::new);
CityDistrict linkedListImpl = new CityDistrict(LinkedList::new);
}
}
不过,我不太确定您的API用户可以决定在内部使用哪种实现(特别是它是否会影响某些性能问题)时是否还可以。这有点破坏了封装规则。而且,如果您关心OOP技术(通常应该做什么),那也很重要。
我宁愿提供默认实现(在这里
ArrayList
是一个不错的选择),并添加通过工厂方法切换到所需实现的功能:class CityDistrict {
List<House> houses;
private CityDistrict(Supplier<List<House>> supplier) {
houses = supplier.get();
}
public CityDistrict() {
this(ArrayList::new);
}
public CityDistrict with(Supplier<List<House>> implementation) {
return new CityDistrict(implementation);
}
}
关于java - 在创建时告诉类成员变量的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45016632/