使用扩展方法可以在不创建新的派生类型、重新编译或以其他方式修改原始类型的情况下,“添加”方法到现有类型中。虽然扩展方法是静态方法的一种特殊形式,但它可以像扩展类型的实例方法一样被调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显的差异。
其实比较多的编程语言都支持了扩展方法,如C#、Visual Basic、Kotlin等,但我们的Java语言就是迟迟不支持,在JDK9中开始支持以jmod方式扩展java功能,JDK16承诺给出动态库调用方案,但是作为JDK8的钉子户的我们如果也想使用扩展方法,就得另寻他路了。
/// 扩展方法 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)); } }
Imports System.Runtime.CompilerServices Module Module3 Sub Main() Dim ex As New ExampleClass ' 调用位置 ex.ExampleMethod("Extension method") End Sub Class ExampleClass ' Define an instance method named ExampleMethod. 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
// 扩展函数(本类中扩展方法) 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注解,程序编译期间帮我们生成直接调用的静态方法,当然IDEA插件能提供更好的支持,下边看下具体的例子。
/** * lombok测试 * * @author reboot */ @ExtensionMethod(StringUtil.class) public class LombokTest { public static void main(String[] args) { System.out.println("".isBlank()); } /** * 字符串工具 * * @author reboot */ public static class StringUtil { /** * 字符串判空 * * @param targetStr 目标str * @return boolean */ public static boolean isBlank(String targetStr) { return targetStr == null || "".equals(targetStr); } } }
编译后的内容可以看到方法已经从 "".isBlank() 转换为 LombokTest.StringUtil.isBlank(""),Lombok也正是通过这种方式提供给我们扩展方法的语法糖,真的好甜。
以上是Java扩展方法怎么创建的详细内容。更多信息请关注PHP中文网其他相关文章!