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

2022-09-04 03:41:40

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

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


答案 1

不,vanilla Java不具有扩展方法。但是,龙目岛增加了许多有用的功能 - 包括扩展方法语法 - 这要归功于它的注释和字节码生成。

可以使用其@ExtensionMethod批注将现有静态方法“转换”为扩展方法。静态方法的第一个参数基本上变成了 。例如,这是一个有效的龙目岛增强型 Java 代码:this

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扩展方法可以在空对象上“调用”——只要静态方法对空值安全,就不会被抛出,因为这基本上被翻译成静态方法调用。是的 - 它归结为语法糖,但我想这仍然比通常的静态方法调用更具可读性。NullPointerException

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


答案 2

装饰器模式可能是最接近的匹配项。它使用接口来维护类型兼容性和组合,以增强现有类的功能。它与你所描述的原则不同,但可能具有相同的目的。


推荐