假设我有一个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/

10-09 00:24