【问题标题】:Why would you declare a variable of type X within the interface X in Java?为什么要在 Java 的接口 X 中声明 X 类型的变量?
【发布时间】:2020-09-08 23:30:02
【问题描述】:

我最近遇到了以下代码:

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;
  }
}

我很困惑这样做的目的是什么。 谁能解释一下为什么有人会写这段代码?

【问题讨论】:

  • 如果我告诉你NULL_FILTER 是公共静态字段有帮助吗?
  • 没有。实例化(new Filter())一个接口是什么意思?
  • 接口没有被实例化。这将创建一个实现接口的匿名类,然后实例化该类。见stackoverflow.com/questions/9157784/…

标签: java variables interface


【解决方案1】:

interface 中的每个字段都隐含为 static,因此这并不是定义每个 Filter 中存在的东西——它定义了一个常见的 Filter,它存储在 Filter 接口的命名空间中,所以你可以写

Filter defaultFilter = Filter.NULL_FILTER;

没有比这更复杂的了。在该接口中定义接口的工厂方法或常量值并不少见——例如Comparator.naturalOrder() 在 Java 8 中。

【讨论】:

    【解决方案2】:

    之前的答案已经提到 NULL_FILTER 是静态的,但它也是最终的。这意味着 NULL_FILTER 是一个方便的常量,您可以在任何地方使用。在做这样的事情时,作者应该通过使对象不可变来确保它确实表现为一个常量。从您共享的代码 sn-p 来看,它看起来确实是不可变的,因为 getFilterCriteria 和 setArrayClause 都不会改变它的状态。虽然如果 setArrayClause 抛出 UnsupportedOperationException 之类的东西会更好。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2010-10-13
    相关资源
    最近更新 更多