在Swift中,您可以创建现有类的扩展,以在需要时向现有类添加其他功能。这也有助于避免创建现有类的子类。
我只是想知道Java中是否存在类似的功能?还是向现有Java类添加其他方法的唯一方法是创建现有类的子类?
最佳答案
不, 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();
}
}
请注意,可以对空对象“调用” Lombok扩展方法-只要静态方法是空安全的,就不会抛出
NullPointerException
,因为它基本上被转换为静态方法调用。是的-它归结为语法糖,但是我想这比通常的静态方法调用更具可读性。除此之外,如果您的项目可以,那么您可以使用其他具有Java互操作性的JVM语言。例如,Kotlin随extension methods functionality一起提供,还有一些已经在标准库中定义的有用扩展。这是Kotlin and Lombok comparison。