Java是否支持Swift类的扩展?

在Swift中,您可以创建现有类的扩展,以便在需要时将其他函数添加到现有类中。 这也有助于避免创建现有类的子类。 我只是想知道在Java中是否存在类似的函数? 或者是将其他方法添加到现有java类的唯一方法是创建现有类的子类? 提前感谢任何帮助!

不,香草Java不具有扩展方法。 不过,由于其注释和字节码生成, Lombok添加了许多有用的功能,包括扩展方法的语法。

您可以使用它的@ExtensionMethod注释来将现有的静态方法“转换”为扩展方法。 静态方法的第一个参数基本上就是this 。 例如,这是一个有效的龙目Java增强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带有扩展方法功能 ,以及已经在标准库中定义的一些有用的扩展。 这是Kotlin和Lombok的比较 。

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

例如在Groovy中:

 List.metaClass.printSize = { println delegate.size() } [1,2,3].printSize() //prints 3 

在Scala中,您可以使用implicit conversions

  class PrefixedString(val s: String) { def prefix = "prefix_" + s } implicit def stringToString(s: String) = new PrefixedString(s) "foo".prefix // returns "prefix_foo" 

请看看这篇文章。

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

装饰模式也许是最接近的匹配。 它使用接口来保持类型的兼容性和组合,以增强现有类的功能。 这与你所描述的原理不一样,但也可以达到同样的目的。