2015-01-15 16 views
2

我的問題不在於瞭解Serializable接口的使用技術理解。 這些問題的答案已經解釋[1] & [2]others爲什麼我們使用前綴「java.io.」每次都不導入java.io.Serializable接口

我的問題是從的觀點語法點。

一邊看Collection接口及其子接口的源代碼,我注意到大部分接口實現Cloneablejava.io.Serializable如下圖所示:

public class TreeSet<E> extends AbstractSet<E> 
implements NavigableSet<E>, Cloneable, java.io.Serializable{ 
... 
} 


public class LinkedHashSet<E> 
extends HashSet<E> 
implements Set<E>, Cloneable, java.io.Serializable { 
... 
} 

public class HashSet<E> 
extends AbstractSet<E> 
implements Set<E>, Cloneable, java.io.Serializable { 
... 
} 

...等等

我也注意到:

  • Collection接口,TreeSetLinkedHashSet等屬於package java.util;
  • Cloneable接口屬於package java.lang;
  • Serializable屬於package java.io;

現在的問題是,我們爲什麼要添加前綴java.ioSerializable之前(如上圖所示),並在Collection接口做了不導入import java.io.Serializable;

回答

2

你提到的類(TreeSetLinkedHashSet等),不帶任何進口和總是使用完整的類名稱,如果它屬於比java.langjava.util

我會說其他的包,它是一個不好的做法,但我們不能責怪喬希布洛赫先生:)

0

有一個接口sunw.io.Serializable,所以他們很可能想區分這兩個。然而,不可能說這是什麼原因。也許這是一個政策,也許他們碰上由於導入了錯誤的難以調試的錯誤...

2

這是Java的進口是如何工作的:

  • 所有的類和接口java.lang會自動顯示。
  • 同一包中的任何類或接口對該包中的其他類和接口都是自動可見的。
  • 其他包中的任何類或接口都必須顯式聲明(包& classname)或導入。

鑑於這些規則:

  • AbstractSetNavigableSet是在相同的封裝中TreeSet並因此自動地可見。
  • Cloneablejava.lang這是自動可見的。
  • Serializable是在java.io等明確聲明(但也可以使用導入)。

在詢問爲什麼你會在大多數情況下使用顯式聲明或導入它的風格。在大多數情況下,使用導入是因爲它使代碼更清晰。

唯一的例外是當兩個或更多的類或具有相同名稱的接口被使用時。在這種情況下,你應該明確地聲明每一種用法。

+0

由@Kayaman建議可以真正區別於'sunw.io.Serializable'(在[這個答案](http:// stackoverflow。 com/a/27963276/1851302)) – KNU

+0

這可能就是爲什麼,儘管'sunw.io.Serializable'在很多年前就被棄用了,我當然認爲當我看到Serializable時它是'java.io .Serializable'。 –

0

這背後沒有很好的理由。這些類別沒有其他導入聲明,並且這些文件中只有一個地方被引用,因此很容易看出作者可能不希望導入的原因。

作爲另一個興趣點,OpenJDK 8中的TreeMap都包含導入語句並使用完全限定名稱。

+0

我安裝的java'jdk1.7.0_51'TreeMap沒有任何導入,但是BUT使用java.io.Serializable'來報告其他情況。 – KNU

+0

鑑於沒有特別的資格,你應該假設我正在談論*當前的* OpenJDK版本(在撰寫本文時爲8)。 –

相關問題