泛型(Generic):一邊解放類別跟函式的僵固型態,一邊提供編譯驗證機制。看視彈性至極、又兼具嚴格規範的一種機制。對程式設計師而言他的出現使得很多程式可以有更高reuse的機會;對編譯器而言,也更能檢查出原本應該於runtime出現的error。提供彈性、提供可驗證性,一個極具巧思的機制,在這我就依照自己的想法來對此加以論述,有興趣的朋友們不妨聽聽。
java泛型,猶如C++ Template。於java中的泛型,其實表徵上跟C++差不了太多。但java的優點是所有物件都繼承於Object故其多型更為自然;而C++就會一不同型態動態的將template一一改編,所以程式碼會越來越大。泛型最主要的用處是『讓具備相同pattern的演算法,只有一些特定型態不同的情況,有更高的抽象化效果。
舉例而言:in C++的template
template <typename T>
T min (T x, T y)
{
return (x < y)? x : y
}
//Template instantiate 1
int m, x, y;
m = min(x, y);
//comipler會將T轉換成int
int min (int x, int y)
{
return (x < y)? x : y
}
//Template instantiate 2
double m, x, y;
m = min(x, y);
//comipler會將T轉換成int
double min (double x, double y)
{
return (x < y)? x : y
}
see...利用template之後,編譯器會自動依據你宣告型態把T更換掉,故多個邏輯相同的演算法,就可以共用相通的一個樣版囉!
in Java:
class GetMin<T> {
void min(T x, T y) {
return (x < y)? x : y
}
}
//create instance帶入整數型態的變數
GetMin<Integer> minObj = new GetMin<Integer>( );
minObj.min(new Integer(10), new Integer(5)); //取得最小直
//create instance帶入浮點數型態的變數
GetMin<Double> minObj = new GetMin< Double >( );
minObj.min(new Double(10), new Double(5)); //取得最小值
see...again Java中採用泛型也可令多個邏輯相同的演算法,共用一相同樣版囉!
在Java提供的JDK1.5之後開始提供了泛型的機制,隨著泛型的來臨,緊接而來的兩大效益分別是:1.如上一段所述開始將多個邏輯相同的演算法抽象化描述,避免過多的程式碼撰寫,也提供日後更高度的維護性;2.泛型的出現亦可避免許多開發者不經易產生的runtime error,舉例而言:以往在Java中許多集合如Vector、ArrayList都能接收Object的物件,故所有的物件皆可丟入,其做法雖彈性無窮,也正因如此常產生程式設計師無心之過,又編譯時間無法攔截故總得等到執行期間才發現錯誤。下面將針對Java泛型真進一步描述~~
泛型:避免集合陷入脫僵野馬的型態錯亂問題而誕生的解決方案。泛型在定義過程的目的是為了再度提高程式利用性;而使用過程中,通常是為了幫更廣泛的集合加以收斂其可使用的型態為何,以避免因型態不合而產生的runtime error。我們可以用下例來觀看:
List<String> list; //此時list此集合只能加入String型別的資料。
list.add(“abc”);
list.add(100); //compile error因為100不是String型別的資料。
切記濫用泛型只會釀成日後維護的大禍。為什麼這樣說呢?…因為現實世界中越抽象同常越複雜,例如,0~9也才10個數字,但我們的整個數學不就是一直圍繞在這幾個數字之前打轉,不論:離散、線代、幾何、數質計算…等無一不是。這在在的表示了越抽象或越趨簡化的形式存在的事務,其呈現的排列組合往往能衍生出來越多複雜的道理所使用。而專案的維護上,複雜會是一個致命的要害,所以泛型是好的發明,但若不能善用,只是一昧的過渡使用,小心您日後的程式碼將很難閱讀,如此維護時間將大幅增加,這是programmer需要自行拿捏的設計準則。
避免複雜的泛型擾人,那就只在最根源提供泛型機制(內部核心處理)。對外界而言都直接用,不必自行定義即有泛型之效,使許多原本在runtime才會出現的錯誤,編譯時間就能察覺,以求快速對程式進行修補,避免將問題延遲到執行期間才執行。這也就是我一直在講的未來的IT世界:內部複雜彈性化、外部簡單方便化。
留言列表