如何解决为什么要在Java的接口X中声明类型X的变量?
我最近遇到了以下代码:
public interface Filter {
Filter NULL_FILTER = new Filter() {
@Override
public Query getFilterCriteria() {
return null;
}
...
@Override
public void setArrayClause(ArrayClause arrayClause) {}
};
/** @return Filter criteria or null if not set */
Query getFilterCriteria();
...
default Filter withProjection(Set<Field> projection) {
this.setFields(projection);
return this;
}
}
这可能使我感到困惑。 有人可以解释为什么有人会编写此代码吗?
解决方法
interface
中的每个字段都隐式地static
,因此这并不是定义每个Filter
中都存在的内容,而是定义了一个存储的公用Filter
在Filter
界面的名称空间中,因此您只需编写
Filter defaultFilter = Filter.NULL_FILTER;
没有比这更复杂的了。在该接口中定义工厂方法或接口的常量值并不罕见-例如Java 8中的Comparator.naturalOrder()
。
先前的答案已经提到NULL_FILTER是静态的,但它也是最终的。意味着NULL_FILTER是一个方便的常量,您可以在任何地方使用。在执行此操作时,作者应通过使对象不可变来确保其确实充当常量。从您共享的代码片段来看,它确实是不可变的,因为getFilterCriteria和setArrayClause都不会改变其状态。尽管setArrayClause抛出诸如UnsupportedOperationException之类的东西会更好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。