[英]Effective Java By Joshua Bloch: Item1 - Static Factory Method
我正在閱讀Joshua Bloch撰寫的Effective Java
,我對Item1 Static Factory Method
有疑問。
引用[布洛赫,第7頁]
接口不能使用靜態方法,因此按照慣例,名為Type的接口的靜態工廠方法放在名為Types的不可實例化的類中。 例如,Java Collections Framework提供不可修改的集合,同步集合等。 幾乎所有這些實現都是通過一個不可實例化的類(java.util.Collections)中的靜態工廠方法導出的。 返回對象的類都是非公共的。
好。 查看源代碼時,我看到java.util.Collection
接口和帶有私有構造函數的java.util.Collections
類(不可實例化的類)。 而且我看到不可實例化的類Collections具有所有靜態方法,就像Bloch所說的那樣。 但布洛赫說,我沒有看到兩個班級之間的聯系
接口不能使用靜態方法,因此按照慣例,名為Type的接口的靜態工廠方法放在名為Types的不可實例化的類中。
任何人都可以向我指出明顯的事嗎?
什么是他說的意思
返回對象的類都是非公共的
這是我獲取java源代碼的地方: http : //grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f
接口不能使用靜態方法,因此按照慣例,名為Type的接口的靜態工廠方法放在名為Types的不可實例化的類中 。
關鍵是“Type [s]”上的復數“s” 。 因此,如果您的接口被稱為Foo
並且您想要創建一個名為MyFoo
實現,那么具有實例化方法的工廠應該按照慣例稱為Foos
。
返回對象的類都是非公共的
這意味着從工廠方法返回的對象類具有私有或默認可見性修飾符,如private class MyFoo{}
因此除了工廠方法之外,它們不能通過任何其他方式實例化。 因為你不能使用私有內部或包私有類中的new
運算符來構造一個Object,而不是它們的范圍(反射旁邊)。
例如:
public interface Foo{ //interface without plural 's' (question 1)
public void bar();
}
public abstract class Foos(){ // abstract factory with plural 's' (question 1)
public static Foo createFoo(){
return new MyFoo();
}
private class MyFoo implements Foo{ // a non visible implementation (question 2)
public void bar(){}
}
}
假設您有一個名為List
的接口,並且您希望使用靜態工廠方法來創建不同類型的列表。 您無法在List
接口中定義靜態工廠方法,因為它是一個接口。 所以你要做的就是有一個返回實現List的類實例的類
public class ListFactory{
private ListFactory(){}
public static List makeArrayList(){...}
public static List makeLinkedList(){...}
public static List makeCrazyList(){...}
}
你不能做這個
public interface List{
public static List makeArrayList();
public static List makeLinkedList();
public static List makeCrazyList();
}
由於List
是界面。
所以以Collections.unmodifiableList(...)為例。 它返回List的一些實現。 但是實現類的名稱是無關緊要的。 此外,所述類僅通過靜態工廠方法構造。
public interface Foo
static public class Factory
public Foo create(){..}
Foo foo = Foo.Factory.create();
1)我在這里不明白你的問題。 Collection
是接口, Collections
有一些像emptyList
這樣的工廠方法
2)例如, Collection.emptyList
返回的List實例是實現List
接口的私有類的實例。
它只是意味着Collections
(和其他類似的)中的靜態工廠方法的返回類型是接口類型(例如List
)而不是特定的實現類(例如java.util.Collections.UnmodifiableList
),這些類對用戶不可見因為這會使事情復雜化並增加API的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.