教你正確的Java擴展方法示例詳解
引言
擴展方法能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型。擴展方法是一種特殊的靜態(tài)方法,但可以像擴展類型上的實例方法一樣進行調(diào)用。對于用 C# 和 Visual Basic 編寫的客戶端代碼,調(diào)用擴展方法與調(diào)用在類型中實際定義的方法沒有明顯的差異。
支持擴展方法的語言
其實比較多的編程語言都支持了擴展方法,如C#、Visual Basic、Kotlin等,但我們的Java語言就是遲遲不支持,在JDK9中開始支持以jmod方式擴展java功能,JDK16承諾給出動態(tài)庫調(diào)用方案,但是作為JDK8的釘子戶的我們?nèi)绻蚕胧褂脭U展方法,就得另尋他路了。
C#
/// 擴展方法 public static class ExpandMethod { /// 兩個數(shù)相加 public static int Sum(this int num,int num2) { return num + num2; } } public class Program { static void Main(string[] args) { /// 調(diào)用位置 Console.WriteLine(3.Sum(2)); } }
Visual Basic
Imports System.Runtime.CompilerServices Module Module3 Sub Main() Dim ex As New ExampleClass ' 調(diào)用位置 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
// 擴展函數(shù)(本類中擴展方法) class Test1 { var name: String = "boyi.chen" } fun Test1.temp() { println("增加擴展函數(shù),打印擴展類的屬性name=${this.name}") } fun main(args: Array<String>) { // 調(diào)用位置 Test1().temp() }
主角登場
Java8本身不支持擴展方法,但我們可以通過插件的方式實現(xiàn)擴展方法,用起來跟直接使用擴展方法一樣一樣的,Lombok就是其中的一款插件。
Lombok @ExtensionMethod
通過Lombok @ExtensionMethod注解,程序編譯期間幫我們生成直接調(diào)用的靜態(tài)方法,當然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); } } }
編譯后的內(nèi)容可以看到方法已經(jīng)從 "".isBlank() 轉(zhuǎn)換為 LombokTest.StringUtil.isBlank(""),Lombok也正是通過這種方式提供給我們擴展方法的語法糖,真的好甜。
Manifold
這里就不具體介紹了,感興趣的朋友可以看這篇文章 Java 缺失的特性:擴展方法 作者寫的還是比較全面的。
總結(jié)
擴展方法能夠使我們的代碼看起來更加簡潔,但是對于曾經(jīng)未接觸過的同學,可能第一次碰到會比較懵,所以要適當使用哦,上邊提到了兩種擴展方法的實現(xiàn)方式,如果項目中本來就引入了Lombok建議直接使用@ExtensionMethod比較好,不要再引入其他插件,這樣會增加項目接手和熟悉的成本,今天就講到這里,希望對閱讀本文章的你有所幫助。
以上就是教你正確的Java擴展方法示例詳解的詳細內(nèi)容,更多關(guān)于Java擴展方法的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java實現(xiàn)將數(shù)字轉(zhuǎn)換成人民幣大寫
前面給大家介紹過使用javascript,php,c#,python等語言實現(xiàn)人民幣大寫格式化,這篇文章主要介紹了java實現(xiàn)將數(shù)字轉(zhuǎn)換成人民幣大寫的代碼,非常的簡單實用,分享給大家,需要的朋友可以參考下2015-04-04SpringMVC中的ConversionServiceExposingInterceptor工具類解析
這篇文章主要介紹了SpringMVC中的ConversionServiceExposingInterceptor工具類解析,ConversionServiceExposingInterceptor是Spring MVC的一個HandlerInterceptor,用于向請求添加一個屬性,需要的朋友可以參考下2023-12-12Java攔截過濾器模式 (Intercepting Filter )實現(xiàn)方法
攔截過濾器模式(Intercepting Filter Pattern)用于對應用程序的請求或響應做一些預處理/后處理,本文通過實例代碼介紹Java攔截過濾器模式 (Intercepting Filter )的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2024-03-03Java8函數(shù)式接口java.util.function速查大全
因為Java8引入了函數(shù)式接口,在java.util.function包含了幾大類函數(shù)式接口聲明,這篇文章主要給大家介紹了關(guān)于Java8函數(shù)式接口java.util.function速查的相關(guān)資料,需要的朋友可以參考下2021-08-08Mybatis中foreach標簽帶來的空格\換行\(zhòng)回車問題及解決方案
這篇文章主要介紹了解決Mybatis中foreach標簽帶來的空格,換行,回車問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04