【问题标题】:Implementing anonymous classes for two or more methods为两个或多个方法实现匿名类
【发布时间】:2013-07-04 23:02:09
【问题描述】:

这是来自article from oracle,关于我正在阅读的匿名课程:

如果你必须实现一个接口,匿名类是理想的 包含两个或多个方法

如果你必须实现的方法少于两个,我认为这是理想的,因为你不需要创建更具体的命名类,但如果你必须实现两个以上的方法会更不可读。

我的问题是: 为什么实现具有 2 个或更多方法的匿名类是理想的?

【问题讨论】:

  • 我不同意。最常实现的匿名接口之一是Comparator,它只有一个方法,就可以了。
  • @Bohemian:现在,您是对的,但是在 JDK 8 中,您能够使用 lambda 表达式实现 Comparator,这将比匿名类。
  • @Jason 也许他应该用 java8 标记它:/ 我现在就做...
  • @Bohemian:不是 nachokk,Oracle 应该在他们的文档中标记这个 Java8。
  • @Bohemian 我没有意识到这是针对 java8 xD

标签: java anonymous-class java-8


【解决方案1】:

你断章取义了。看前面那句话:

因为EventHandler<ActionEvent>接口只包含一个 方法,您可以使用 lambda 表达式代替匿名类 表达。有关详细信息,请参阅Lambda Expressions 部分。

(我强调)

将来您将能够使用 lambda 表达式而不是只有一个方法的匿名类,因此只有当您的接口有多个方法时,使用匿名类才有意义。

如果它有许多方法,可读性可能会受到影响,但没有其他语言结构强制规定特定实现只能在代码中的一个点使用。

【讨论】:

  • mm 我明白了,我误解了,所以在 jdk 8 中,只有一种方法的接口你可以使用 lambda 表达式作为anonymous methods 而不是使用匿名类,否则它们会有 lambda 表达式的骨架实现?
  • 这只是一种更简洁的语法(仅在必须提供单个方法时才有效)。在引擎盖下,它仍然是同一个匿名类,只是少了输入。
  • 使用 lambda 表达式你更关心方法体和方法参数。并且类名是根据您使用 lambda 表达式的上下文来选择的。
【解决方案2】:

本文包含来自 JDK 8 的信息,在这种情况下,Lambda 表达式可用于实现单个函数接口,而不必使用匿名类。

所以 2+ 方法建议严格适用于 JDK 8,对于 7 及以下匿名类是单方法和多方法接口实现的唯一方法(好吧,在完整类之外)。

【讨论】:

    【解决方案3】:

    这可能是考虑到 Java 8(手指交叉)中用于单方法接口(即Lambda Expressions)的新简洁语法。如果接口确实只有一个方法,那将提供比匿名类更好的选择。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多