Java 是否支持类似 Swift 的 class 扩展?

Does Java support Swift-like class extensions?

在 Swift 中,您可以创建现有 class 的扩展,以便在需要时向现有 class 添加其他功能。这也有助于避免创建现有 class.

的子 class

我只是想知道 Java 中是否存在类似的功能?还是将其他方法添加到现有 Java class 的唯一方法是创建现有 class 的子 class?

Decorator Pattern 可能是最接近的匹配项。它使用接口来保持类型兼容性和组合以增强现有的 class' 功能。这与您描述的原理不同,但可能具有相同的目的。

不,vanilla Java 没有扩展方法。然而,Lombok 添加了许多有用的功能 - 包括扩展方法语法 - 由于其注释和字节码生成。

您可以使用其 @ExtensionMethod 注释将现有静态方法 "convert" 扩展方法。静态方法的第一个参数基本上变成了this。例如,这是一个有效的 Lombok 增强 Java 代码:

import lombok.experimental.ExtensionMethod;

@ExtensionMethod({java.util.Arrays.class, Extensions.class})
public class ExtensionMethodExample {
  public String test() {
    int[] intArray = {5, 3, 8, 2};
    intArray.sort();

    String iAmNull = null;
    return iAmNull.or("hELlO, WORlD!".toTitleCase());
  }
}

class Extensions {
  public static <T> T or(T obj, T ifNull) {
    return obj != null ? obj : ifNull;
  }

  public static String toTitleCase(String in) {
    if (in.isEmpty()) return in;
    return "" + Character.toTitleCase(in.charAt(0)) +
        in.substring(1).toLowerCase();
  }
}

请注意,Lombok 扩展方法可以在空对象上 "invoked" - 只要静态方法是空安全的,就不会抛出 NullPointerException,因为这基本上已转换为静态方法称呼。是的 - 它归结为语法糖,但我想这仍然比通常的静态方法调用更具可读性。

除此之外,您还可以使用其他一些具有 Java 互操作性的 JVM 语言,如果这在您的项目中没问题的话。例如,Kotlin comes with extension methods functionality, as well as some useful extensions already defined in the standard library. Here's a Kotlin and Lombok comparison.

它可以用 JVM 的其他语言完成,例如 Scala,Groovy 或 Closure。

例如 Groovy:

List.metaClass.printSize = {
    println delegate.size()
}

[1,2,3].printSize() //prints 3

在 Scala 中你可以使用 implicit class:

implicit class PrefixedString(val s: String) {
   def prefix = "prefix_" + s 
}

"foo".prefix // returns "prefix_foo"

请看this article.

重要的一点是,Groovy/Scala 源代码旨在编译为 Java 字节码,以便生成的 类 可用于 Java 代码。