java – 在创建时告诉类成员变量的类型
发布时间:2020-12-15 04:39:27 所属栏目:Java 来源:网络整理
导读:假设我有一个CityDistrict类,如下所示: class CityDistrict { ListHouse houses; ...} 假设对于某些用例,ArrayList更适合于房屋,有时甚至是LinkedList.您如何告诉CityDistrict创建它应该用于房屋的类 我的三个想法是: 1)这是参数类的用例吗?就像是 class
假设我有一个CityDistrict类,如下所示:
class CityDistrict { List<House> houses; ... } 假设对于某些用例,ArrayList更适合于房屋,有时甚至是LinkedList.您如何告诉CityDistrict创建它应该用于房屋的类 我的三个想法是: 1)这是参数类的用例吗?就像是 class CityDistrict<T> { T<House> houses; ... } 然后,您可以创建CityDistrict< ArrayList>.但是我认为T应该是List类型的信息在这里丢失了. 2)或者您可以创建几个构造函数或静态工厂方法,如generateArrayListCityDistrict,但我认为这有点难看. 3)在构造函数CityDistrict(int ListFlag)中使用某种标志变量,并将1映射到ArrayList,依此类推.我觉得还有点难看. 我错过了明显的吗?什么是干净和OOP处理这种情况的方式? 解决方法
您可以传递供应商< 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); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |