教你正確的Java擴(kuò)展方法示例詳解
引言
擴(kuò)展方法能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型、重新編譯或以其他方式修改原始類型。擴(kuò)展方法是一種特殊的靜態(tài)方法,但可以像擴(kuò)展類型上的實(shí)例方法一樣進(jìn)行調(diào)用。對(duì)于用 C# 和 Visual Basic 編寫的客戶端代碼,調(diào)用擴(kuò)展方法與調(diào)用在類型中實(shí)際定義的方法沒有明顯的差異。
支持?jǐn)U展方法的語言
其實(shí)比較多的編程語言都支持了擴(kuò)展方法,如C#、Visual Basic、Kotlin等,但我們的Java語言就是遲遲不支持,在JDK9中開始支持以jmod方式擴(kuò)展java功能,JDK16承諾給出動(dòng)態(tài)庫(kù)調(diào)用方案,但是作為JDK8的釘子戶的我們?nèi)绻蚕胧褂脭U(kuò)展方法,就得另尋他路了。
C#
/// 擴(kuò)展方法
public static class ExpandMethod {
/// 兩個(gè)數(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
// 擴(kuò)展函數(shù)(本類中擴(kuò)展方法)
class Test1 {
var name: String = "boyi.chen"
}
fun Test1.temp() {
println("增加擴(kuò)展函數(shù),打印擴(kuò)展類的屬性name=${this.name}")
}
fun main(args: Array<String>) {
// 調(diào)用位置
Test1().temp()
}
主角登場(chǎng)
Java8本身不支持?jǐn)U展方法,但我們可以通過插件的方式實(shí)現(xiàn)擴(kuò)展方法,用起來跟直接使用擴(kuò)展方法一樣一樣的,Lombok就是其中的一款插件。
Lombok @ExtensionMethod
通過Lombok @ExtensionMethod注解,程序編譯期間幫我們生成直接調(diào)用的靜態(tài)方法,當(dāng)然IDEA插件能提供更好的支持,下邊看下具體的例子。
/**
* lombok測(cè)試
*
* @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 目標(biāo)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也正是通過這種方式提供給我們擴(kuò)展方法的語法糖,真的好甜。

Manifold
這里就不具體介紹了,感興趣的朋友可以看這篇文章 Java 缺失的特性:擴(kuò)展方法 作者寫的還是比較全面的。
總結(jié)
擴(kuò)展方法能夠使我們的代碼看起來更加簡(jiǎn)潔,但是對(duì)于曾經(jīng)未接觸過的同學(xué),可能第一次碰到會(huì)比較懵,所以要適當(dāng)使用哦,上邊提到了兩種擴(kuò)展方法的實(shí)現(xiàn)方式,如果項(xiàng)目中本來就引入了Lombok建議直接使用@ExtensionMethod比較好,不要再引入其他插件,這樣會(huì)增加項(xiàng)目接手和熟悉的成本,今天就講到這里,希望對(duì)閱讀本文章的你有所幫助。
以上就是教你正確的Java擴(kuò)展方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java擴(kuò)展方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
java集合類遍歷的同時(shí)如何進(jìn)行刪除操作
這篇文章主要介紹了java集合類遍歷的同時(shí)如何進(jìn)行刪除操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java使用JMeter進(jìn)行高并發(fā)測(cè)試
軟件的壓力測(cè)試是一種保證軟件質(zhì)量的行為,本文主要介紹了Java使用JMeter進(jìn)行高并發(fā)測(cè)試,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java switch case數(shù)據(jù)類型原理解析
這篇文章主要介紹了Java switch case數(shù)據(jù)類型原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java實(shí)現(xiàn)簡(jiǎn)單的五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
JavaWeb入門:HttpResponse和HttpRequest詳解
這篇文章主要介紹了Django的HttpRequest和HttpResponse對(duì)象,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2021-07-07
完美解決Logback configuration error detected的問題
這篇文章主要介紹了完美解決Logback configuration error detected的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

