2011-09-02 46 views
1

可能重複:
Why should the interface for a Java class be prefered?從Java中實現接口的類創建對象

在Java中,有沒有這兩條線之間的差異?如果是這樣,它是什麼,我應該什麼時候使用任何一個?有一個首選的慣例嗎?

請注意,ArrayList實現List。

List<String> bunchOfStrings = new ArrayList<String>(); 

ArrayList<String> bunchOfStrings = new ArrayList<String>(); 
+0

並具體到這個例子:http://stackoverflow.com/questions/4062982/list-versus-arraylist –

+0

@Kublai,如果你點擊我的鏈接,你會發現它也是針對這個問題的。 ;) –

+0

@Kirk - 是的,我的意思是接受答案。只需添加信息。 –

回答

1

在這兩種情況下,你正在實例化一個ArrayList。不同的是,在第一種情況下,您將它稱爲List(ArrayList實現的接口),因此您無權訪問ArrayList類的特定方法,但只能訪問接口方法。

使用THI第一:

List<String> bunchOfStrings = new ArrayList<String>(); 

這樣,您就可以切換不同的List實現(ArrayList中,向量):

public class AClass(){ 
    List<String> bunchOfStrings; 

    public List<String> getList(){ 
     bunchOfStrings = new ArrayList<String>(); 
     //or you can switch to : bunchOfStrings = new Vector<String>(); 
     return bunchOfString; 
    } 
} 
2

在Java中,有沒有這兩條線之間的差異?

是的,有細微的差別,而List<String>變體是優選的。

有沒有優先的約定?

公約說,你應該 「針對接口編程」。原因是交換實際實現變得更容易(在這種情況下,從ArrayListLinkedList)。

1

您應該使用可能的最通用類型。所以在這種情況下,這是List。唯一一次使用更具體的類型是,如果該類型具有定義的方法,則更通用的類型不會。

原因是,如果方法接受類型,如List,則該方法的用戶可以提供他們想要的任何類型的列表。如果方法只接受ArrayList,則用戶不能使用任何其他類型的List。

0

如果聲明bunchOfStrings作爲List,你不能調用任何ArrayList方法(不含鑄造),即使它指向一個ArrayList對象 - 你只能調用都在List類聲明的方法。

出於這個原因,你可能會認爲這是更好地始終聲明你的變量類型是儘可能具體,但在宣佈它作爲一個List通常是可取的,因爲它允許您更改底層實現你的List,而不必改變你的代碼中的其他內容。您可以輕鬆地修改您的代碼不會破壞任何東西在你的代碼如下:

List<String> bunchOfStrings = new LinkedList<String>(); 

作爲一個經驗法則,永遠只能申報你的變量的類型是一個特定的子類,如果你...

  1. ...需要訪問僅在子類中可用的方法。
  2. ...需要將對象實例傳遞給只接受該子類的對象的方法。
0

這就是所謂的Polymorphism。這是非常有用的,並沒有真正的缺點。

優點:

您可以將這個實例變量發送到想要一個「表」對象的任何方法。

在方法聲明中使用List,您可以將該方法打開爲List的子類型的任何內容,而不僅僅是類型ArrayList。

缺點:

你將不得不您的變量轉換爲一個ArrayList訪問或設置任何功能/方法/字段是ArrayList的(但不是在列表)。但這些東西仍然可用。