如何在泛型类型级别或方法级别定义之间进行选择?下面我有两个例子,用于解决某些问题的替代(正确)实现。我试图理解这些差异,以及为什么我会选择一个。在类级别或方法级别泛型之间进行选择
示例1: 给出一些处理搜索树的算法。为了帮助用户进行调试,算法中的某些状态会触发事件。用户可以实现监听这些事件的例如EventListener
,例如,一些记录器实用程序。
public Node<N extends Number>{ .. }
的事件可以通过以下两种方式来实现:
选项1:(类级)
public class PruneNodeEvent<N extends Number> extends EventObject
{
public final Node<N> node; //Node being pruned
public PruneNodeEvent(Object source, Node<N> node)
{
super(source);
this.node = node;
}
}
选项2:(方法级)
public class PruneNodeEvent extends EventObject
{
public final Node<? extends Number> node; //Node being pruned
public PruneNodeEvent(Object source, Node<? extends Number> node)
{
super(source);
this.node = node;
}
}
其中考虑应该做出选择一个在另一个上?
示例2: 给出一些侦听决策的算法的抽象实现。每次做出新决策时,算法都会更新其数据结构,但不会存储决策。由于这是一个抽象类(模板),我们不知道最终用户将如何使用这个类。同样,我们有2种选择:
选项1:(职业等级)
public abstract class AbstractAlgorithm<T extends Data>
implements DecisionListener<T> {
@Override
public void makeDecision(Decision<T> d)
{
}
@Override
public void reverseDecision(Decision<T> d)
{
}
}
选项2:(方法级别)
public abstract class AbstractAlgorithm implements DecisionListener
{
@Override
public void makeDecision(Decision<? extends Data> d) {
}
@Override
public void reverseDecision(Decision<? extends Data> d) {
}
}
哪些方面的考虑提出,要选择一个在另一方面?
鼓励在设计泛型类(ala Effective Java 2nd Edition)时提供处理Dos,注意事项和注意事项的良好参考以支持您的答案。
许多优秀的问题都会根据专家的经验产生一定程度的意见,但对这个问题的回答往往基于意见而非事实,参考或具体专业知识。 –
这些例子都涵盖消费者,考虑供应商的情况(例如'List.get(...)',如果返回'?extends Object'会怎么样)。 –
@RomanC第一个答复已经是一个很好的**事实**答案......并非所有的设计问题都是基于作者的偏好,还是星星的排列... –