gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 13:03:32 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com