java - 这样的界面设计会不会被认为是不好的?

标签 java design-patterns interface

我写了一个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/

相关文章:

c# - 在 C# 中定义服务特定枚举的位置?

vb.net - 子接口(interface)的Load(x)函数隐藏父接口(interface)的Load()函数

java - Java中枚举常量的序列号

java - 使用列表参数将 HQL 查询转换为可执行的 SQL 查询

c# - 如何代理对对象实例的调用

dart - Dart:何时使用 setter/getter 与最终剂

c# - 多重继承的解决方案 - 有机会改变保护级别

java - 除了继承,在实时 Web 开发中其他 OO 特性有什么主要作用吗?

java - 我应该在 JComboBox 中使用枚举还是字符串

c# - 寻找如何重构我的算法的想法