我写了一个interface
来存储数据List
/ Map
,并且有能力将其检索回来。像这样:
public interface Repository {
<K, V> void register(String typeTag, Key<K> key, V value);
void unregister(String typeTag);
void unregister(String... typeTags);
void unregister(Collection<String> typeTags);
<T> void add(String typeTag, T object);
<T> void add(String typeTag, Collection<T> object);
<T, K> T get(String typeTag, Key<K> key);
<T, U, K> Map<T, U> getAsMap(String typeTag, Collection<Key<K>> keys);
<T, U> Map<T, U> getAsMap(String typeTag);
<T, K> List<T> getAsList(String typeTag, Collection<Key<K>> keys);
<T> List<T> getAsList(String typeTag);
<T, K> Map<String, T> get(Collection<String> typeTags, Collection<Key<K>> keys);
<T> T remove(String typeTag, T object);
void clear(String typeTag);
void clear();
<U, V> Map<U, V> map(String typeTag1, String typeTag2) throws IllegalMappingException;
<U, V, K> Map<U, V> map(String typeTag1, String typeTag2, Collection<Key<K>> keys) throws IllegalMappingException;
<U, V> Map<U, V> map(String typeTag1, Criteria<U> type1Criteria, String typeTag2, Criteria<V> type2Criteria) throws IllegalMappingException;
}
现在,我已经仔细考虑了这个界面的目的,并且可以通过以下方法进行定义:
register()
,unregister()
,add()
,get()
,remove()
,clear()
和map()
但是,正如您所看到的,这些方法的重载版本支持在Collection
中获取和回馈数据。这些可以分类为&#34;方便&#34;方法(在我看来)。但它让我想知道实现者将不得不将这些方法作为强制实施,并且实现这些方法的人数太多了。我个人觉得设计过多地影响了界面和负担&#34;应该有所减少。
首先,
这个设计真的很糟糕吗?
在继续扩展层次结构之前,我应该考虑/应用并记住更改此设计的内容/策略。
修改
我只是在Java 7及更低版本中寻找解决方案。
答案 0 :(得分:1)
这似乎是default
接口方法的一个很好的用例。它们基本上允许您根据接口中的其他方法实现这些便捷方法。
例如,在add
:
<T> void add(String typeTag, T object); // defined by user
default <T> void add(String typeTag, Collection<T> object) {
for(T t : object) {
add(typeTag, t);
}
}
但是,如果用户想要实现默认方法(例如因为它们可以提供更优化的实现),那么 仍然可以覆盖default
方法。
编辑:对于per-Java8,您可以创建一个实现便捷方法的abstract
类,并将其作为扩展用户类的模板。虽然这是一个不太理想的解决方案,因为它强制用户扩展一个类,并且你只能扩展一个类。
abstract class AbstractRepository implements Repository {
...
@Override
public <T> void add(String typeTag, Collection<T> objects) {
for(T t : objects) {
add(typeTag, t);
}
}
...
}
...
class RepositoryImpl extends AbstractRepository {
...
}