我写了一个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;
}
现在,我已经很好地思考了这个接口(interface)的用途,基本上可以通过以下方法来定义它:
register()
, unregister()
, add()
, get()
, remove()
, clear()
和map()
但是,正如您所看到的,这些方法有重载版本,支持在 Collection
中获取和返回数据。 s。这些可以归类为“方便”方法(在我看来)。但这让我想知道实现者将不得不强制实现这些方法,而且要实现的方法太多了。我个人感觉设计对界面的负担太大了,应该减轻一些“负担”。
首先,
这个设计真的很糟糕吗?
在继续扩展层次结构之前,我应该考虑/应用哪些事情/策略,并记住什么来更改此设计。
编辑:
我只在 Java 7 及以下版本中寻找解决方案。
最佳答案
这似乎是默认
接口(interface)方法的一个很好的用例。它们基本上允许您根据接口(interface)中的其他方法来实现这些便捷方法。
例如,添加
:
<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);
}
}
但是,如果用户想要实现默认方法(例如因为他们可以提供更优化的实现),他们仍然可以覆盖默认
方法。
编辑:对于每个 Java8,您可以创建一个实现便利方法的抽象类,并将其作为用户类扩展的模板。尽管这是一个不太理想的解决方案,因为它强制用户扩展一个类,而您只能扩展 1 个类。
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 {
...
}
关于java - 这样的界面设计会不会被认为是不好的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44227793/