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

Tho*_*hor 12 java extension-methods subclass

在Swift中,您可以创建现有类的扩展,以便在需要时向现有类添加其他函数.这也有助于避免创建现有类的子类.

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

Jus*_*bie 7

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

您可以使用其@ExtensionMethod注释将现有静态方法"转换"为扩展方法.静态方法的第一个参数基本上变成了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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

除此之外,如果项目中没有问题,您可以使用其他一些JVM语言与Java互操作性.例如,Kotlin提供了扩展方法功能,以及已在标准库中定义的一些有用的扩展.这是Kotlin和Lombok的比较.