扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显的差异。
支持扩展方法的语言
其实比较多的编程语言都支持了扩展方法,如C#、Visual Basic、Kotlin等,但我们的Java语言就是迟迟不支持,在JDK9中开始支持以jmod方式扩展java功能,JDK16承诺给出动态库调用方案,但是作为JDK8的钉子户的我们如果也想使用扩展方法,就得另寻他路了。
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static class ExpandMethod { public static int Sum(this int num,int num2) { return num + num2; } }
public class Program { static void Main(string[] args) { Console.WriteLine(3.Sum(2)); } }
|
Visual Basic
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Imports System.Runtime.CompilerServices
Module Module3
Sub Main() Dim ex As New ExampleClass ex.ExampleMethod("Extension method") End Sub
Class ExampleClass Public Sub ExampleMethod() Console.WriteLine("Instance method") End Sub End Class
<Extension()> Sub ExampleMethod(ByVal ec As ExampleClass, ByVal stringParameter As String) Console.WriteLine(stringParameter) End Sub
End Module
|
Kotlin
1 2 3 4 5 6 7 8 9 10 11 12 13
| class Test1 { var name: String = "boyi.chen" }
fun Test1.temp() { println("增加扩展函数,打印扩展类的属性name=${this.name}") }
fun main(args: Array<String>) { Test1().temp() }
|
主角登场
Java8本身不支持扩展方法,但我们可以通过插件的方式实现扩展方法,用起来跟直接使用扩展方法一样一样的,Lombok就是其中的一款插件。
Lombok @ExtensionMethod
通过Lombok @ExtensionMethod注解,程序编译期间帮我们生成直接调用的静态方法,当然IDEA插件能提供更好的支持,下边看下具体的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
@ExtensionMethod(StringUtil.class) public class LombokTest {
public static void main(String[] args) { System.out.println("".isBlank()); }
public static class StringUtil {
public static boolean isBlank(String targetStr) { return targetStr == null || "".equals(targetStr); } } }
|
编译后的内容可以看到方法已经从 “”.isBlank() 转换为 LombokTest.StringUtil.isBlank(“”) ,Lombok也正是通过这种方式提供给我们扩展方法的语法糖,真的好甜。
![image.png](https://cdn.nlark.com/yuque/0/2023/png/26851474/1679582712957-9c50f3f4-7942-4386-a8c4-ea9e84022ce0.png#averageHue=%23191817&clientId=udbed8735-f793-4&from=paste&height=303&id=u01c21442&originHeight=606&originWidth=2056&originalType=binary&ratio=2&rotation=0&showTitle=false&size=118846&status=done&style=none&taskId=ub1ecb3f1-b627-48a7-8fa2-5e75bfbdf94&title=&width=1028)
Manifold
这里就不具体介绍了,感兴趣的朋友可以看这篇文章 Java 缺失的特性:扩展方法 作者写的还是比较全面的。
总结
扩展方法能够使我们的代码看起来更加简洁,但是对于曾经未接触过的同学,可能第一次碰到会比较懵,所以要适当使用哦,上边提到了两种扩展方法的实现方式,如果项目中本来就引入了Lombok建议直接使用@ExtensionMethod比较好,不要再引入其他插件,这样会增加项目接手和熟悉的成本,今天就讲到这里,希望对阅读本文章的你有所帮助。