泛型理解之元組類庫
阿新 • • 發佈:2018-11-10
1.需求
僅一次方法呼叫就能返回多個不同型別物件。大家應該經常遇到這樣的需求,但是就我們所知的return語句只允許返回單個物件。
2.解決方案
方案一:
直接控制方法值返回Map<String,Object>物件,每次在方法返回物件時,動態建立所需要返回的多個物件的物件Map集合。
方案二:
建立一個物件,用它來持有想要返回的多個物件,需要在每次需要的時候,專門建立一個類來完成這樣的工作。
方案三:
通過泛型的建立一個元組類庫,一次性解決該問題,以後可直接使用該類庫作為返回物件。同時,我們在編譯器就能確保型別安全。具體介紹一下元組的概念。
3.方案三具體解決方案
元組:將一組物件直接打包儲存於其中的一個單一的物件,這個容器物件允許讀取其中元素,但是不允許向其中存放新的物件。(也稱為資料傳遞物件或者信使)
通常,元組可以具有任意長度,同時,元組物件可以是任意不同的型別,不過我們希望能夠為物件指明其型別,並且從容器中讀取出來時,可以得到正確的型別,要處理不同長度的問題,需要建立多個不同的元組,如下例子是一個二維選組物件,它可以儲存兩個任意型別的物件,並且隱含的保持了其中元素的次序。
分析一下上面的元組基類,我們之所以使用public修飾符而沒有使用private修飾符,原因如下:客戶端程式可以讀取到first和second物件,然後可以隨心所欲的使用這兩個物件,但是它們卻無法將其他值賦予first或者second,因為變數物件使用了final宣告。 另外還有一種設計考慮,即你希望允許客戶端改變first和second所引用的物件,如果想要使用具有不同元素的元組,就像只要求它們建立一個新的TwoTuple物件。 當然也可以使用private修飾符修飾,使用get方法獲取。 之後我們可以利用繼承機制實現長度更長的元組,組成所需要的元組基類。如:/** * 兩物件元組基類 * * @param <A> 泛型物件A * @param <B> 泛型物件B * @author Alex */ public class TwoTupleBase<A, B> { public final A first; public final B second; public TwoTupleBase(A a, B b) { this.first = a; this.second = b; } public A getFirst() { return first; } public B getSecond() { return second; } @Override public String toString() { return "TwoTupleBase{" + "first=" + first + ", second=" + second + '}'; } }
在我們使用元組的時候,只需選擇長度合適的元組,將其作為方法的返回值,然後在return語句中建立該元組,並返回即可。如:/** * 三物件元組基類 * * @param <A> 泛型物件A * @param <B> 泛型物件B * @param <C> 泛型物件C * @author Alex */ public class ThreeTupleBase<A, B, C> extends TwoTupleBase<A, B> { public final C third; public ThreeTupleBase(A a, B b, C third) { super(a, b); this.third = third; } public C getThird() { return third; } @Override public String toString() { return "ThreeTupleBase{" + "third=" + third + ", first=" + first + ", second=" + second + '}'; } }