为什么要在 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 的东西会更好。