優先考慮泛型的方法

泛型單例工廠模式

package com.innitech;

interface UnaryFunctions<T> {
	T apply(T org);
}

public class Unary {
	public static void main(String[] args) {
		String[] strings = { "jute", "hemp", "nylon" };
		UnaryFunctions<String> sameString = identityFunction();
		for (String string : strings) {
			System.out.println(sameString.apply(string));
		}

		Number[] numbers = { 1, 2.0, 3L };
		UnaryFunctions<Number> sameNumber = identityFunction();
		for (Number number : numbers) {
			System.out.println(sameNumber.apply(number));
		}
	}

	private static UnaryFunctions<Object> IDENTITY_FUNCTION = new UnaryFunctions<Object>() {
		public Object apply(Object org) {
			return org;
		}
	};

	@SuppressWarnings("unchecked")
	public static <T> UnaryFunctions<T> identityFunction() {
		return (UnaryFunctions<T>) IDENTITY_FUNCTION;
	}
}
有時,會需要創建不可變但又適合於許多不同的對象。由於泛型是通過擦除實現的,可以給所有必要的類型參數使用單個對象,但是需要編寫一個靜態工廠方法,重複地給每個必要的類型參數分發對象。這種模式最常用於函數對象,如Collections.reverseOrder,但也適合用於像Collections.emptySet這樣的集合。


遞歸類型限制:

public static <T extends Comparable<T>> T max(List<T> list) {
		Iterator<T> i = list.iterator();
		T result = i.next();
		while(i.hasNext()) {
			T t = i.next();
			if (t.compareTo(result) > 0)
				result = t;
		}
		return result;
	}

泛型方法就像泛型一樣,使用起來比要求客戶端轉換輸入參數並返回值的方法來得更加安全,也更加容易。就像類型一樣,你應該確保新方法可以不用轉換就能使用,這通常意味着要它們泛型化。並且就像類型一樣,還應該將現有的方法泛型化,使新用戶使用起來更加輕鬆,且不會破壞現有的客戶端。

摘抄自:Effective Java

發佈了25 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章