簡體   English   中英

有效的Java作者:Joshua Bloch:第1項 - 靜態工廠方法

[英]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的不可實例化的類中。

  1. 任何人都可以向我指出明顯的事嗎?

  2. 什么是他說的意思

返回對象的類都是非公共的

這是我獲取java源代碼的地方: http//grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f

  1. 接口不能使用靜態方法,因此按照慣例,名為Type的接口的靜態工廠方法放在名為Types的不可實例化的類中

    關鍵是“Type [s]”上復數“s” 因此,如果您的接口被稱為Foo並且您想要創建一個名為MyFoo實現,那么具有實例化方法的工廠應該按照慣例稱為Foos

  2. 返回對象的類都是非公共的

    這意味着從工廠方法返回的對象類具有私有或默認可見性修飾符,如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM