java - Java 8 JDK 中是否有默认方法及其用法的好示例?

标签 java java-8 default-method

正如关于虚拟扩展方法(默认方法)的官方声明所述:

The purpose of virtual extension methods (default methods) is to enable interfaces to be evolved in a compatible manner after their initial publication.”

我可以在 JDK 中看到一些关于此操作的好示例吗? 到目前为止,我已经在 java.util.Collection 接口(interface)和其他几个接口(interface)中找到了,但最好有一个更全面的列表。

编辑:我并不是在寻找使用默认方法是否安全(因为我已经阅读了链接的问题)。我一直在寻找 JDK 中的实际示例。

最佳答案

除了集合之外,我还知道标准类中有几个地方:

  • Java SQL API 具有界面增强功能。 ResultSet.updateObject , PreparedStatement.setObject , PreparedStatement.executeLargeUpdate (不同于 executeUpdate 返回 long 而不是 int )等等。默认情况下,他们抛出 UnsupportedOperationException或其他一些异常。这就是“界面进化”:一种用新功能增强旧界面的方法。

  • java.util.function 中的函数有允许组合它们的默认方法。这些方法预计不会被重新定义,因为函数式接口(interface)主要用于与 lambda 一起使用。这些方法只是为了方便。这不是“接口(interface)演变”,因为这些接口(interface)首先出现在 Java 8 中。但是,如果这些方法不是默认的,您将无法使用 lambda 来表达这些接口(interface),因为会违反单一抽象方法规则。

  • java.util.Comparator 中添加了几个默认方法:reversed() , thenComparing()等等。默认实现也很好,通常不打算被替换。这与函数类似,但是 Comparator界面以前就存在,所以这也是界面的一种演变。

  • java.util.Spliterator接口(interface)有默认方法。这实际上是一个很好的例子,因为这里显示了不同目的的默认方法。 getComparator()方法默认会抛出异常,但如果 spliterator 使用 SORTED 则必须覆盖它特征。 hasCharacteristic()方法只是使用非默认 characteristics() 的便捷方法方法,并且可能永远不应该重新定义。 forEachRemaining()默认实现将始终正常工作,但覆盖它可能会对某些 spliterator 产生更有效的结果。 getExactSizeIfKnown()默认实现也始终是正确的,通常不需要重新定义它。但是,如果您的 spliterator 从未调整过大小,您可以对其进行一些优化,只需返回 -1 .

关于java - Java 8 JDK 中是否有默认方法及其用法的好示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31786666/

相关文章:

java - jsp文件中的springmvc maven链接文件

java - 使用 Jackson 库自定义 pretty-print

java - 如何使用 Collectors.averagingDouble 计算双数组的平均值?

java - Spring Boot 无法正常工作出现一些错误?

java - 使用带有默认方法的新 Java8 接口(interface)

java - JCheckBox 已检查,但它显示 else 语句

java - 从米利斯得到错误的日期

java - 如何将单个元素列表转换为java 8可选

java - 如何从 TestNG 测试和 Selenium 的接口(interface)调用默认方法?

java - 使用接口(interface)的默认方法实现方法 - 矛盾吗?