泛型單例工廠模式
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