複習筆記13 函數 重載 內聯



public class Test14
{
	void method(int arg0, int arg1){}
	
	//這種換參數名字的方式並不算重載
//	void method(int arg1, int arg0){}
	
	//參數列表類型的排列組合不一樣,可以形成重載
	void method(int arg0, byte arg1){}
	
	//參數類型位置調換也可以形成重載
	void method(byte arg0, int arg1){}
	
	//參數個數不一樣也可以形成重載
	void method(int arg0, int arg1, int arg2){}
	
	//返回值類型不同也不算重載,jvm會不知道應該使用
	//哪個函數,但也不是無法避免
//	char method(int arg0, int arg1){}
	
	//如果對於相同參數列表的函數,有多種返回值,
	//可以在函數內實現重載的情況,返回值爲Object
//	Object method(int arg0, int arg1){}
	
	/**
	 * 這裏我們可以想一下,如果我們不知道需要多少個參數
	 * 比如求任意個 數的和,難道還能定義無數個函數?因爲
	 * 我們並不知道用戶會什麼時候調用那些個組合的函數
	 * 
	 * 在老版本的java裏,老程序員對於這種方式的處理,
	 * 都是採用數組爲參數來處理的。
	 */
	
	//像main函數吧
	void method(int[] args)
	{
		//我們這裏的調用方式就將是這樣,但寫起來會很麻煩
		method(new int[]{1,2});
		method(new int[]{1,2,3,4,5});
	}
	
	//可變參數列表,該參數列表表示支持任意個數的參數
	//這個新特性也是專門爲了解決上邊的問題而出現的,
	//雖然實現是一樣的,但更簡便
	void method$1(int... arg0)
	{ 
		//for example
		method$1(1,2);
		method$1(1,2,3,4,5);
		
		//由於這種可變參數的實現,是以數組來實現的
		//所以訪問方面,也是用數組的方式
		arg0[0] = 1;
		
		//所以由上邊的代碼我們也可以這樣調用
		method$1(new int[]{1,2});
		method$1(new int[]{1,2,3,4,5});
	}
	
	/**
	 * 函數的內聯
	 * 
	 * 內聯在重構中是很關鍵也是很重要的一種方式,
	 * 簡單來說,就是把一段很長的代碼,不利於閱讀
	 * 的代碼分而治之,從而簡化閱讀以及維護
	 */
	
	//假設代碼我們這樣寫,第一段和第二段代碼都擠在一起
	//對於閱讀的人來說很費勁,他不知道你的第二段功能是
	//怎麼分割的,很不直觀,所以得理解整個函數的功能之後
	//才能具體的區分出來,而有的代碼耦合性非常高,單獨
	//分離出功能會很費勁
	void A()
	{
		//case 1
		
		//case 2
	}
	
	//如果代碼以這種方式來寫,並對內聯函數取個很形象的名字,
	//不論是別人閱讀還是自己維護都會很方便,對於調試錯誤也
	//有幫助
	void B()
	{
		//case 1
		case1();
		
		//case 2
		case2();
	}
	void case1(){}
	void case2(){}
	
	/**
	 * 內聯是一種很實用的技巧,但也不能過渡使用,如果一個函數
	 * 最後被分割成成百上千的內聯函數,最後只會變得更糟糕。
	 * 
	 * 深度內聯是最可恥的,比如a內聯b和c,c又d和e,如此類推,
	 * 最後想找一個關鍵功能要累死
	 */
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章