Java 什么';在存储API中定义单数与复数GET的理想方法是什么?

Java 什么';在存储API中定义单数与复数GET的理想方法是什么?,java,api,data-access-layer,Java,Api,Data Access Layer,我的应用程序中有一个内部存储层,它处理Foo对象。在Get操作期间,数据层对集群Get有显著的好处,但实际上我只在大约10%的时间内执行多次Get。以下是我考虑过的各种方法: 方法A: interface FooStorage { Foo getFoo(String name); List<Foo> getFoos(List<String> names); } 接口存储{ Foo getFoo(字符串名称); 列出getFoos(列出名称); } 方法B: i

我的应用程序中有一个内部存储层,它处理
Foo
对象。在Get操作期间,数据层对集群Get有显著的好处,但实际上我只在大约10%的时间内执行多次Get。以下是我考虑过的各种方法:

方法A:

interface FooStorage {
  Foo getFoo(String name);
  List<Foo> getFoos(List<String> names);
}
接口存储{
Foo getFoo(字符串名称);
列出getFoos(列出名称);
}
方法B:

interface FooStorage {
  List<Foo> getFoos(List<String> names);
}
class StorageUtility {
  public static <T> T firstOrNull(List<T> data) { ... }
}
接口存储{
列出getFoos(列出名称);
}
类存储实用程序{
公共静态T firstOrNull(列表数据){…}
}
方法C:

interface FooStorage {
  List<Foo> getFoos(String... names);
}
class StorageUtility {
  public static <T> T firstOrNull(List<T> data) { ... }
}
接口存储{
列出getFoos(字符串…名称);
}
类存储实用程序{
公共静态T firstOrNull(列表数据){…}
}
接近A的缺点是需要支持的曲面更大。
方法B的缺点是,当90%的时间我不需要时,让消费者建立一个列表。 C方法的缺点是将列表复制到数组的开销占10%


有没有一种规范的正确方法可以做到这一点?

在这种情况下,我倾向于使用以下构造:

Foo getFoo(String name) {
    return firstOrNull(getFoos(name));
}
List<Foo> getFoos(String ... names) {
    return getFoos(Arrays.asList(names));
}
List<Foo> getFoos(List<String> names) {
    ....
}
Foo-getFoo(字符串名称){
返回firstOrNull(getFoos(name));
}
列出getFoos(字符串…名称){
返回getFoos(Arrays.asList(names));
}
列出getFoos(列出名称){
....
}
您的客户机每次都应该使用最合适的方法,如果您后来发现性能需要对
getFoo(name)
采用更有针对性的方法,您可以重新实现该方法

我认为,与在存储系统的接口/实现中保存几行代码相比,更重要的是保持用户代码的可读性(避免仅仅为了满足API而创建列表)