Java扩展方法怎么创建

      引言

      使用扩展方法可以在不创建新的派生类型、重新编译或以其他方式修改原始类型的情况下,“添加”方法到现有类型中。虽然扩展方法是静态方法的一种特殊形式,但它可以像扩展类型的实例方法一样被调用。对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法没有明显的差异。

      支持扩展方法的语言

      其实比较多的编程语言都支持了扩展方法,如C#、Visual Basic、Kotlin等,但我们的Java语言就是迟迟不支持,在JDK9中开始支持以jmod方式扩展java功能,JDK16承诺给出动态库调用方案,但是作为JDK8的钉子户的我们如果也想使用扩展方法,就得另寻他路了。

      C#

      /// 扩展方法
      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

      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

      Kotlin

      // 扩展函数(本类中扩展方法)
      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插件能提供更好的支持,下边看下具体的例子。

      /**
       * 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扩展方法怎么创建的详细内容,更多请关注www.sxiaw.com其它相关文章!