Java通過匿名類來實現(xiàn)回調(diào)函數(shù)實例總結(jié)
在C語言中,函數(shù)名可以當(dāng)做函數(shù)指針傳遞給形參從而實現(xiàn)回調(diào)
void f1() { printf("f1()\n"); }
void f2() { printf("f2()\n"); }
void f3() { printf("f3()\n"); }
void do_func(void(*f)()) { f(); }
int main()
{
do_func(f1);
do_func(f2);
do_func(f3);
}
在C++11中,實現(xiàn)回調(diào)還可以通過函數(shù)模板和lambda表達(dá)式的方式
template <typename Func>
void do_func(Func f) { f(); }
int main()
{
do_func([]() { printf("f1()"); });
do_func([]() { printf("f2()"); });
do_func([]() { printf("f3()"); });
}
而假如回調(diào)函數(shù)的代碼實現(xiàn)較為復(fù)雜,且具有重用價值,lambda表達(dá)式這種一次性的方案就不太適合,在C++11之前,是通過函數(shù)對象來實現(xiàn)的。函數(shù)對象說白了就是一個類的普通對象,只不過C++可以重載括號運(yùn)算符,導(dǎo)致調(diào)用類的對象的operator()方法時,就像調(diào)用函數(shù)一樣自然。
而分析本質(zhì),其實回調(diào)函數(shù)就是一種函數(shù)簽名(若干個輸入?yún)?shù)、一個輸出參數(shù))的規(guī)范,java雖不存在函數(shù)聲明,但是java可以用接口來強(qiáng)制規(guī)范。
interface Funcable {
void Func();
}
這樣只要實現(xiàn)了該接口的類,都有一個函數(shù)簽名和void Func()一致的成員函數(shù)(嘛,還是不習(xí)慣方法(method)這種叫法),于是只需要把實現(xiàn)了該接口的類的對象傳入函數(shù)中,然后在函數(shù)中調(diào)用該對象的Func()方法即可
class F1 implements Funcable {
@Override
public void Func() {
System.out.println("f1()");
}
}
public class Test {
public static void do_func(Funcable funcable) {
funcable.Func();
}
public static void main(String[] args) {
do_func(new F1());
}
}
這里節(jié)省代碼量,就不把類F2、F3給寫出來了。并且利用java的匿名類可以節(jié)省代碼,類似于lambda表達(dá)式
do_func(new Funcable() {
@Override
public void Func() {
System.out.println("f2()");
}
});
說到lambda表達(dá)式,它是可以捕獲外部變量的,在Java這種方式還可以通過匿名內(nèi)的匿名構(gòu)造函數(shù)來顯式捕獲外部的變量
String msg = "f3()";
do_func(new Funcable() {
String _msg;
{
_msg = msg;
}
@Override
public void Func() {
System.out.println(_msg);
}
});
這種做法就很像lambda表達(dá)式了,因為匿名類的匿名構(gòu)造函數(shù)是只能以外部變量為構(gòu)造參數(shù)的,相當(dāng)于lambda表達(dá)式的“捕獲”,對應(yīng)C++的lambda表達(dá)式寫法就是
std::string msg = "f3()";
do_func([&msg]() { std::cout << msg << std::endl; });
java8也有l(wèi)ambda表達(dá)式了,因此可以寫成這樣
do_func(() -> { System.out.println(msg); });
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助~如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持!
相關(guān)文章
解決Java中由于數(shù)據(jù)太大自動轉(zhuǎn)換成科學(xué)計數(shù)法的問題
今天小編就為大家分享一篇解決Java中由于數(shù)據(jù)太大自動轉(zhuǎn)換成科學(xué)計數(shù)法的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Spring Boot thymeleaf模板引擎的使用詳解
這篇文章主要介紹了Spring Boot thymeleaf模板引擎的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
使用springboot aop記錄接口請求的參數(shù)及響應(yīng)
該文章介紹了如何使用SpringAOP的切面注解,如@Before和@AfterReturning,來記錄Controller層的方法輸入?yún)?shù)和響應(yīng)結(jié)果,還討論了@Around注解的靈活性,允許在方法執(zhí)行前后進(jìn)行更多控制,需要的朋友可以參考下2024-05-05
Springboot整合Swagger2后訪問swagger-ui.html 404報錯問題解決方案
這篇文章主要介紹了Springboot整合Swagger2后訪問swagger-ui.html 404報錯,本文給大家分享兩種解決方案,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
SpringBoot開發(fā)中的數(shù)據(jù)源詳解
這篇文章主要介紹了SpringBoot開發(fā)中的數(shù)據(jù)源詳解,數(shù)據(jù)源(Data Source)顧名思義,數(shù)據(jù)的來源,是提供某種所需要數(shù)據(jù)的器件或原始媒體,在數(shù)據(jù)源中存儲了所有建立數(shù)據(jù)庫連接的信息,需要的朋友可以參考下2023-09-09

