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"
重要的一点是,Groovy/Scala 源代码旨在编译为 Java 字节码,以便生成的 类 可用于 Java 代码。
在 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"
重要的一点是,Groovy/Scala 源代码旨在编译为 Java 字节码,以便生成的 类 可用于 Java 代码。