java - 如何创建填充并返回现有或新集合的通用方法?
问题描述
我目前正在开发一个存储库,它允许用户将对象持久保存到外部存储。我想添加对列表和集合的支持,所以我添加了如下函数:
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中甚至可能吗?
解决方案
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
实例的功能,您可以创建两种方法 - readCollection
和readNewCollection
.
作为替代方案,您可以保留单个C readCollection(String fileName, C defaultValue)
方法,并决定在null
作为第二个参数传递时创建哪个实例。例如,您可以决定默认类型是ArrayList
.
顺便说一句,即使您保留原来的两个方法,您也会遇到同样的问题 -readList
并且readSet
- 因为readSet
可以返回任何Set
实现,所以如果第二个参数是null
,它必须决定Set
使用哪个实现。
推荐阅读
- php - Laravel Dusk:找不到 Chrome 二进制文件
- javascript - 在不运行构造函数的情况下初始化一个类以开玩笑地测试其他方法
- php - 在 php 邮件上获取 302($toEmail, $emailSubject, $body, $headers);
- azure-devops - 以编程方式将迭代和日历事件添加到 Azure DevOps
- python - 新版本的 scipy 中的错误?
- html - 如何从 thymeleaf 中的对象列表中查找特定元素并获取字段值
- php - 我需要获取两个日期之间的间隔,一个来自系统日期,一个来自数据库
- javascript - 使用拖放排列待办事项
- python - 我正在尝试抓取网站,但遇到了问题。当我尝试抓取数据时,看起来 html 与我看到的不同
- recursion - 寻找一个例子来生动地说明尾递归调用比非尾递归占用更少的空间?