2017-05-28 58 views
0

我写了一个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中获取和返回数据。这些可以归类为“便利”方法(就我看来)。但是,这让我怀疑实现者将不得不将这些方法实施为强制措施,并且实施这些方法的人太多了。我个人有这样的感觉,即设计对界面的影响过大,应该减少“负担”。

首先,

这是设计很糟糕?

我应该考虑哪些事项/策略/应用并在继续扩展层次结构之前记住要改变此设计。

编辑:

我只在Java 7和更少寻求解决方案。

+0

对于工作代码,codereview.stackexchange.com将是一个更好的地方问。在一定程度上:-) – GhostCat

+0

downvoter照顾解释? –

回答

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方法。


编辑:对于每Java8你可以创建一个abstract类,它实现了方便的方法,并且具有作为用户类继承的模板。虽然这是一个不太理想的解决方案,因为它会强制用户扩展一个类,并且只能扩展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 { 
    ... 
} 
+1

但是它们是在Java 8中引入的。我正在考虑使用Java 7或更少的解决方案。有没有Java 7的东西?作为一项要求,我将在我的问题中反映这一点。 –

+0

@pulp_fiction或者,您可以使用已经实现的这些便捷方法创建一个'abstract'类,并让用户扩展该类。但这是一个不太理想的解决方案,因为它会强制用户扩展一个类,并且只能扩展1个类。 –

相关问题