没有理由必须创建一个全新的子类,您可以在创建实例时覆盖所需的方法。
这是一个例子:
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@Nonnull
检查空值并使用 JSR=305注释。注释不仅会在你的代码有机会之前捕捉到,它还隐含地记录了你的意图是什么。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>