如何在泛型類型級別或方法級別定義之間進行選擇?下面我有兩個例子,用於解決某些問題的替代(正確)實現。我試圖理解這些差異,以及爲什麼我會選擇一個。在類級別或方法級別泛型之間進行選擇
示例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第一個答覆已經是一個很好的**事實**答案......並非所有的設計問題都是基於作者的偏好,還是星星的排列... –