2013-02-20 87 views
1

我正在尋找一個java.util.Queue實現或工廠方法,它爲我提供了一個Queue,它默默丟棄了null元素。靜默丟棄空元素的java.util.Queue

java.util.LinkedList是不是一個解決方案,因爲它允許隊列null元件和至unqueuenull元件(...的Queue正向unqueue,直到它爲空或者具有non -null元件頭部位置)。
java.util.ArrayDeque不是解決方案,因爲它在嘗試添加null元素時拋出NullPointerException

應可以構建這樣與現有Queue一個Queue(與得到由新構造Queue時操作刪除了現有Queue可能含有null元件)。

那裏已經有一個強大的解決方案嗎?

+4

靜靜地不向隊列添加空元素呢? – AlexWien 2013-02-20 01:05:35

+4

只是繼承另一個隊列類,並在添加時扔掉了空元素。 – 2013-02-20 01:06:04

+0

@HotLicks我正在尋找的'Queue'或工廠方法應允許「從另一個'Queue'構建」。由於其他隊列可能包含'null'元素,因此僅在*隊列*(例如「add」)操作期間拋出'null'元素不會填滿'Queue'的合同。我相應地更新了我的問題。 – Abdull 2013-02-20 01:20:18

回答

3

雖然我意識到這並不直接回答你的問題,但如果你找不到一個實現並決定做你自己的類,這個答案應該適用。

因爲子類不符合超類的預期實現和使用(例如super可以依靠能夠添加空元素,因此這會打破它),我會勸阻子類化,如'Hot Licks'所示。此外,您通過更改主要實施細節來打破Is-A原則。

我建議你使用組合,在那裏你通過自己的方法提供適當的方法,這可能會在必要時改變行爲。

瞭解更多有效Java的Chapter 16

1

沒有理由必須創建一個全新的子類,您可以在創建實例時重載所需的方法。

下面是一個例子:

final ArrayDeque<String> nonNullDeque = new ArrayDeque<String>() { 
    @Override 
    public void addFirst(final String s) { 
     if (s != null) { super.addFirst(s); } 
    } 

    @Override 
    public boolean add(final String s) { 
     return s != null && super.add(s); 
    } 

    @Override 
    public void addLast(final String s) { 
     if (s != null) { super.addLast(s); } 
    } 
}; 

這是你必須爲忽略方法與自己行爲的能力,整個的原因,超階級的內部運作應該是一個黑盒子,你的合同與它接受參數並返回其接口支持的結果,而不是支持其內部工作。

就我個人而言,我會更進一步,而不是檢查空值,並使用Google findbugs library使用JSR = 305 @Nonnull註釋。在您的代碼獲得機會之前,註釋不僅會捕獲null,還會隱式記錄您的意圖。

public void addFirst(@Nonnull final String s) { 
    if (s != null) { super.addFirst(s); } 
} 

Maven依賴項位於Central Repo中,因此可以輕鬆添加到項目中。

<dependency> 
    <groupId>com.google.code.findbugs</groupId> 
    <artifactId>jsr305</artifactId> 
    <version>2.0.1</version> 
</dependency> 
相關問題