妙解Java中的回調機制(CallBack)。本站提示廣大學習愛好者:(妙解Java中的回調機制(CallBack))文章只能為提供參考,不一定能成為您想要的結果。以下是妙解Java中的回調機制(CallBack)正文
列舉簡介:
為何要用列舉:
列舉是Java1.5出來以後新增的類型,它可以用來界說一組取值規模固定的的變量。
在列舉沒有出來之前,要界說如許的變量,常常是經由過程界說一個接口,將分歧的變量
應用分歧的整數賦值。然則如許的卻有著很顯著的缺陷:
1.不克不及包管其界說數值的正當性;
在現實編程中,常常存在著如許的“數據集”,它們的數值在法式中是穩固的,並且“數據集”中的元素是無限的。
例如禮拜一到禮拜日七個數據元素構成了一周的“數據集”,春夏秋冬四個數據元素構成了四時的“數據集”。
在java中若何更好的應用這些“數據集”呢?是以列舉便派上了用處,以下代碼具體引見了列舉的用法。
package com.ljq.test; /** * 列舉用法詳解 * * @author jiqinlin * */ public class TestEnum { /** * 通俗列舉 * * @author jiqinlin * */ public enum ColorEnum { red, green, yellow, blue; } /** * 列舉像通俗的類一樣可以添加屬性和辦法,可認為它添加靜態和非靜態的屬性或辦法 * * @author jiqinlin * */ public enum SeasonEnum { //注:列舉寫在最後面,不然編譯失足 spring, summer, autumn, winter; private final static String position = "test"; public static SeasonEnum getSeason() { if ("test".equals(position)) return spring; else return winter; } } /** * 性別 * * 完成帶有結構器的列舉 * * @author jiqinlin * */ public enum Gender{ //經由過程括號賦值,並且必需帶有一個參結構器和一個屬性跟辦法,不然編譯失足 //賦值必需都賦值或都不賦值,不克不及一部門賦值一部門不賦值;假如不賦值則不克不及寫結構器,賦值編譯也失足 MAN("MAN"), WOMEN("WOMEN"); private final String value; //結構器默許也只能是private, 從而包管結構函數只能在外部應用 Gender(String value) { this.value = value; } public String getValue() { return value; } } /** * 定單狀況 * * 完成帶有籠統辦法的列舉 * * @author jiqinlin * */ public enum OrderState { /** 已撤消 */ CANCEL {public String getName(){return "已撤消";}}, /** 待審核 */ WAITCONFIRM {public String getName(){return "待審核";}}, /** 期待付款 */ WAITPAYMENT {public String getName(){return "期待付款";}}, /** 正在配貨 */ ADMEASUREPRODUCT {public String getName(){return "正在配貨";}}, /** 期待發貨 */ WAITDELIVER {public String getName(){return "期待發貨";}}, /** 已發貨 */ DELIVERED {public String getName(){return "已發貨";}}, /** 已收貨 */ RECEIVED {public String getName(){return "已收貨";}}; public abstract String getName(); } public static void main(String[] args) { //列舉是一品種型,用於界說變量,以限制變量的賦值;賦值時經由過程“列舉名.值”獲得列舉中的值 ColorEnum colorEnum = ColorEnum.blue; switch (colorEnum) { case red: System.out.println("color is red"); break; case green: System.out.println("color is green"); break; case yellow: System.out.println("color is yellow"); break; case blue: System.out.println("color is blue"); break; } //遍歷列舉 System.out.println("遍歷ColorEnum列舉中的值"); for(ColorEnum color : ColorEnum.values()){ System.out.println(color); } //獲得列舉的個數 System.out.println("ColorEnum列舉中的值有"+ColorEnum.values().length+"個"); //獲得列舉的索引地位,默許從0開端 System.out.println(ColorEnum.red.ordinal());//0 System.out.println(ColorEnum.green.ordinal());//1 System.out.println(ColorEnum.yellow.ordinal());//2 System.out.println(ColorEnum.blue.ordinal());//3 //列舉默許完成了java.lang.Comparable接口 System.out.println(ColorEnum.red.compareTo(ColorEnum.green));//-1 //-------------------------- System.out.println("==========="); System.err.println("季候為" + SeasonEnum.getSeason()); //-------------- System.out.println("==========="); for(Gender gender : Gender.values()){ System.out.println(gender.value); } //-------------- System.out.println("==========="); for(OrderState order : OrderState.values()){ System.out.println(order.getName()); } } }�盤算器來協助完成。
3. 幼師回來了
發明小明完成了3位數的加法,先生認為小明很聰慧,是個可塑之才。因而又在黑板上寫下了“26549 + 16487 = ”,讓小明上課之前完成填空,然後又回辦公室了。
小明看著教室裡面撒歡兒的小同伴,不由悲從中來。再不出去玩,這個課間就要廢了啊!!!! 看著小紅再一次遞下去的盤算器,小明心生一計:讓小紅代庖。
小明告知小紅標題是“26549 + 16487 = ”,然後指出填寫成果的詳細地位,然後就出去快活的游玩了。
這裡,不把小紅零丁完成出來,而是把這個只能算加法的盤算器和小紅算作一個全體,一個會算成果還會填空的超等盤算器。這個超等盤算器須要傳的參數是兩個加數和要填空的地位,而這些內容須要小明提早告訴,也就是小明要把本身的一部門辦法暴漏給小紅,最簡略的辦法就是把本身的援用和兩個加數一塊告知小紅。
是以,超等盤算器的add辦法應當包括兩個操作數和小明本身的援用,代碼以下:
public class SuperCalculator { public void add(int a, int b, Student xiaoming) { int result = a + b; xiaoming.fillBlank(a, b, result); } }
小明這邊如今曾經不須要默算,也不須要應用盤算器了,是以只須要有一個辦法可以向小紅追求贊助就好了,代碼以下:
public class Student { private String name = null; public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, this); } public void fillBlank(int a, int b, int result) { System.out.println(name + "乞助小紅盤算:" + a + " + " + b + " = " + result); } }
測試代碼以下:
public class Test { public static void main(String[] args) { int a = 26549; int b = 16487; Student s = new Student("小明"); s.callHelp(a, b); } }
運轉成果為:
小明乞助小紅盤算:26549 + 16487 = 43036
履行流程為:小明經由過程本身的callHelp辦法挪用了小紅(new SuperCalculator())
的add辦法,在挪用的時刻將本身的援用(this)當作參數一並傳入,小紅在應用盤算器得出成果以後,回調了小明的fillBlank辦法,將成果填在了黑板上的空格裡。
燈燈燈!到這裡,回調功效就正式退場了,小明的fillBlank辦法就是我們常說的回調函數。
經由過程這類方法,可以很顯著的看出,關於完成先生的填空題這個義務上,小明曾經不須要期待到加法做完且成果填寫在黑板上能力去跟小同伴們撒歡了,填空這個任務由超等盤算器小紅來做了。回調的優勢曾經開端表現了。
第4章. 門口的婆婆
老練園的門口有一個頭發斑白的妻子婆,天天風雨無阻在那邊擺著地攤賣一些快過時的渣滓食物。因為年事年夜了,頭腦有些懵懂,常常算不清晰本身掙了若干錢。有一天,她有意間聽到了小明跟小同伴們吹捧本身若何在小紅的贊助下與幼師斗智斗勇。因而,婆婆決議找到小紅牌超等盤算器來做本身的小副手,並供給一包衛龍辣條作為待遇。小紅經不住引誘,准許了。
回看一下上一章的代碼,我們發明小紅牌超等盤算器的add辦法須要的參數是兩個整型變量和一個Student對象,然則妻子婆她不是先生,是個小商販啊,這裡確定要做修正。這類情形下,我們很天然的會想到繼續和多態。假如讓小明這個先生和妻子婆這個小商販從一個父類停止繼續,那末我們只須要給小紅牌超等盤算器傳入一個父類的援用便可以啦。
不外,現實應用中,斟酌到java的單繼續,和不願望把本身太多器械暴漏給他人,這裡應用從接口繼續的方法合營外部類來做。
換句話說,小紅願望今後持續向班裡的小同伙們供給盤算辦事,同時還能向妻子婆供給算賬辦事,乃至今後可以或許拓展其別人的營業,因而她向一切的顧客商定了一個方法,用於同一的處置,也就是本身須要的操作數和做完盤算以後應當怎樣做。這個同一的辦法,小紅做成了一個接口,供給給了年夜家,代碼以下:
public interface doJob { public void fillBlank(int a, int b, int result); }
由於靈感來自幫小明填空,是以小紅保存了初心,把一切營業都當作填空(fillBlank)來做。
同時,小紅修正了本身的盤算器,使其可以同時處置分歧的完成了doJob接口的人,代碼以下:
public class SuperCalculator { public void add(int a, int b, doJob customer) { int result = a + b; customer.fillBlank(a, b, result); } }
小明和妻子婆拿到這個接口以後,只需完成了這個接口,就相當於依照同一的形式告知小紅獲得成果以後的處置方法,依照之前說的應用外部類來做,代碼以下:
小明的:
public class Student { private String name = null; public Student(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doHomeWork implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "乞助小紅盤算:" + a + " + " + b + " = " + result); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
妻子婆的:
public class Seller { private String name = null; public Seller(String name) { // TODO Auto-generated constructor stub this.name = name; } public void setName(String name) { this.name = name; } public class doHomeWork implements doJob { @Override public void fillBlank(int a, int b, int result) { // TODO Auto-generated method stub System.out.println(name + "乞助小紅算賬:" + a + " + " + b + " = " + result + "元"); } } public void callHelp (int a, int b) { new SuperCalculator().add(a, b, new doHomeWork()); } }
測試法式以下:
public class Test { public static void main(String[] args) { int a = 56; int b = 31; int c = 26497; int d = 11256; Student s1 = new Student("小明"); Seller s2 = new Seller("妻子婆"); s1.callHelp(a, b); s2.callHelp(c, d); } }
運轉成果以下:
小明乞助小紅盤算:56 + 31 = 87
妻子婆乞助小紅算賬:26497 + 11256 = 37753元
總結
可以很顯著的看到,小紅曾經把這件工作當作一個事業來做了,看她給接口命的名字doJob就曉得了。
有人或許會問,為何妻子婆擺攤能掙那末多錢? 你的存眷點有成績好嗎!!這裡聊的是回調機制啊!!
我只曉得,後來小紅的營業赓續擴展,終究在老練園卒業之前,用掙到的錢買了人生的第一套房子。
以上就是本文關於Java中的回調機制(CallBack) 的風趣詳解,願望給年夜家進修java有所贊助。也感謝年夜家對的支撐。