为什么要在 Java 中的 X 接口中声明 X 类型的变量?
Why would you declare a variable of type X within the interface X in Java?
我最近运行进入以下代码:
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;
没有比这更复杂的了。在该接口中定义接口的工厂方法或常量值并不少见——例如Comparator.naturalOrder()
在 Java 8.
之前的回答已经提到NULL_FILTER是静态的,但也是final的。意思是 NULL_FILTER 是一个方便的常量,你可以在任何地方使用。在做这样的事情时,作者应该通过使对象不可变来确保它确实表现为常量。从您共享的代码片段来看,它看起来确实是不可变的,因为 getFilterCriteria 和 setArrayClause 都不会改变它的状态。尽管如果 setArrayClause 抛出类似 UnsupportedOperationException 的东西会更好。
我最近运行进入以下代码:
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;
没有比这更复杂的了。在该接口中定义接口的工厂方法或常量值并不少见——例如Comparator.naturalOrder()
在 Java 8.
之前的回答已经提到NULL_FILTER是静态的,但也是final的。意思是 NULL_FILTER 是一个方便的常量,你可以在任何地方使用。在做这样的事情时,作者应该通过使对象不可变来确保它确实表现为常量。从您共享的代码片段来看,它看起来确实是不可变的,因为 getFilterCriteria 和 setArrayClause 都不会改变它的状态。尽管如果 setArrayClause 抛出类似 UnsupportedOperationException 的东西会更好。