首页 > 解决方案 > 如何创建填充并返回现有或新集合的通用方法?

问题描述

我目前正在开发一个存储库,它允许用户将对象持久保存到外部存储。我想添加对列表和集合的支持,所以我添加了如下函数:

public <E extends Persistable> List<E> readList(String fileName, List<E> defaultValue)
public <E extends Persistable> Set<E> readSet(String fileName, Set<E> defaultValue)

现在我认为为每种类型的Collection. 我想过这样的事情:

public <C extends Collection<E>, E extends Persistable> C readCollection(String fileName, C defaultValue)

我的问题如下:如果用户调用readCollection(FILE, collection)并传递一个非 nullcollection作为第二个参数,我可以使用它将存储的项目添加到该collection. 但是,如果用户之前存储了项目并null作为第二个参数传递,我必须创建一个新的collection. 这在Java中甚至可能吗?

标签: javagenerics

解决方案


Collection您可以传递一个,而不是传递一个默认实例Supplier<C>

public <C extends Collection<E>, E extends Persistable> C readCollection(String fileName, Supplier<C> supplier)
{
    C collection = supplier.get();
    ...
    return collection;
}

现在您可以使用Supplier<C>来创建Collection.

您可以使用以下方法调用该方法:

readCollection(name, ArrayList::new)

或者:

readCollection(name, HashSet::new)

如果您仍然需要将元素添加到现有Collection实例的功能,您可以创建两种方法 - readCollectionreadNewCollection.

作为替代方案,您可以保留单个C readCollection(String fileName, C defaultValue)方法,并决定在null作为第二个参数传递时创建哪个实例。例如,您可以决定默认类型是ArrayList.

顺便说一句,即使您保留原来的两个方法,您也会遇到同样的问题 -readList并且readSet- 因为readSet可以返回任何Set实现,所以如果第二个参数是null,它必须决定Set使用哪个实现。


推荐阅读