1. 程式人生 > >泛型理解之元組類庫

泛型理解之元組類庫

1.需求 僅一次方法呼叫就能返回多個不同型別物件。大家應該經常遇到這樣的需求,但是就我們所知的return語句只允許返回單個物件。 2.解決方案 方案一: 直接控制方法值返回Map<String,Object>物件,每次在方法返回物件時,動態建立所需要返回的多個物件的物件Map集合。 方案二: 建立一個物件,用它來持有想要返回的多個物件,需要在每次需要的時候,專門建立一個類來完成這樣的工作。 方案三: 通過泛型的建立一個元組類庫,一次性解決該問題,以後可直接使用該類庫作為返回物件。同時,我們在編譯器就能確保型別安全。具體介紹一下元組的概念。 3.方案三具體解決方案 元組:將一組物件直接打包儲存於其中的一個單一的物件,這個容器物件允許讀取其中元素,但是不允許向其中存放新的物件。(也稱為資料傳遞物件或者信使)

通常,元組可以具有任意長度,同時,元組物件可以是任意不同的型別,不過我們希望能夠為物件指明其型別,並且從容器中讀取出來時,可以得到正確的型別,要處理不同長度的問題,需要建立多個不同的元組,如下例子是一個二維選組物件,它可以儲存兩個任意型別的物件,並且隱含的保持了其中元素的次序。

/**
 * 兩物件元組基類
 *
 * @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 +
                '}';
    }
}
分析一下上面的元組基類,我們之所以使用public修飾符而沒有使用private修飾符,原因如下:客戶端程式可以讀取到first和second物件,然後可以隨心所欲的使用這兩個物件,但是它們卻無法將其他值賦予first或者second,因為變數物件使用了final宣告。 另外還有一種設計考慮,即你希望允許客戶端改變first和second所引用的物件,如果想要使用具有不同元素的元組,就像只要求它們建立一個新的TwoTuple物件。 當然也可以使用private修飾符修飾,使用get方法獲取。 之後我們可以利用繼承機制實現長度更長的元組,組成所需要的元組基類。如:
/**
 * 三物件元組基類
 *
 * @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 +
                '}';
    }
}
在我們使用元組的時候,只需選擇長度合適的元組,將其作為方法的返回值,然後在return語句中建立該元組,並返回即可。如: