沒有理由必須創建一個全新的子類,您可以在創建實例時重載所需的方法。
下面是一個例子:
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>
靜靜地不向隊列添加空元素呢? – AlexWien 2013-02-20 01:05:35
只是繼承另一個隊列類,並在添加時扔掉了空元素。 – 2013-02-20 01:06:04
@HotLicks我正在尋找的'Queue'或工廠方法應允許「從另一個'Queue'構建」。由於其他隊列可能包含'null'元素,因此僅在*隊列*(例如「add」)操作期間拋出'null'元素不會填滿'Queue'的合同。我相應地更新了我的問題。 – Abdull 2013-02-20 01:20:18