優點
1. 和構造方法不一樣,靜態工廠方法可以有自己明確的名字。比如newInstance、getInstance、valueOf,可以更明確知道這些方法名字的意思。而構造方法只能透過new類名來建立,比如Person person = new Person()。
2. 不必沒次呼叫時都建立一個新物件。使用靜態工廠方法對外提供單例,其實就是提前準備好例項,這樣可以重複利用,減少重複建立例項,不過這也需要注意執行緒安全問題。
3. 可以返回原返回型別的任何子類的物件。這個可以這麼理解,例如EnumSet類,EnumSet是抽象類是不能被例項化的,但是可以透過裡面的noneOf靜態工廠方法返回它子類的物件,RegularEnumSet和JumboEnumSet都是EnumSet的子類,程式碼如下:
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable {
EnumSet(Class<E>elementType, Enum[] universe) {}
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
4.在建立引數化型別例項的時候,它們使程式碼變得更加簡潔。這條可以這麼理解,比如在建立一個Map型別物件時,我們一般可以這麼建立:
Map<String, List<String>> m = new HashMap<String, List<String>>();
但是在JDK7以上的版本,泛型引數是可以被推匯出來的,所以可以有更簡潔的寫法:
Map<String, List<String>> m = new Hash
優點
1. 和構造方法不一樣,靜態工廠方法可以有自己明確的名字。比如newInstance、getInstance、valueOf,可以更明確知道這些方法名字的意思。而構造方法只能透過new類名來建立,比如Person person = new Person()。
2. 不必沒次呼叫時都建立一個新物件。使用靜態工廠方法對外提供單例,其實就是提前準備好例項,這樣可以重複利用,減少重複建立例項,不過這也需要注意執行緒安全問題。
3. 可以返回原返回型別的任何子類的物件。這個可以這麼理解,例如EnumSet類,EnumSet是抽象類是不能被例項化的,但是可以透過裡面的noneOf靜態工廠方法返回它子類的物件,RegularEnumSet和JumboEnumSet都是EnumSet的子類,程式碼如下:
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable {
EnumSet(Class<E>elementType, Enum[] universe) {}
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
}
4.在建立引數化型別例項的時候,它們使程式碼變得更加簡潔。這條可以這麼理解,比如在建立一個Map型別物件時,我們一般可以這麼建立:
Map<String, List<String>> m = new HashMap<String, List<String>>();
但是在JDK7以上的版本,泛型引數是可以被推匯出來的,所以可以有更簡潔的寫法:
Map<String, List<String>> m = new Hash