2013-03-05 31 views
3

我明白這個問題聽起來很奇怪,但我想知道爲什麼java.io.Serializable接口已經被精確地實現爲一個接口,而不是一個類?爲什麼java.io.Serializable不是一個類?

是什麼讓我想到這一點,是我們正在談論首要readObject/writeObject方法,而根據定義,我們不覆蓋他們(即沒有超類型我們Serializable對象已經實施這些方法)。

因此,如果Serializable將是一個類,它可能已經實現了默認readObject/writeObject方法,然後exenting類可能已經能夠真正覆蓋說的方法。


下面是一個不工作變通方法,說明了我的話:

public class Serializable implements java.io.Serializable { 

    private static final long serialVersionUID = 356223041512972356L; 

    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { 
     stream.defaultReadObject(); 
    } 

    protected void writeObject(ObjectOutputStream stream) throws IOException { 
     stream.defaultWriteObject(); 
    } 

} 

public class MyClass extends Serializable { 

    private static final long serialVersionUID = -5437634103734137046L; 

    @Override 
    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException { 
     super.readObject(stream); 
     // custom readObject method 
    } 

} 

PS:所提供的解決方法不起作用,因爲readObject/writeObject方法必須聲明爲private而我是protected

+0

可能的重複[爲什麼readObject和writeObject是私有的,爲什麼我會明確寫入瞬態變量?](http://stackoverflow.com/questions/7467313/why-are-readobject-and-writeobject-private-and - 爲什麼會我寫的瞬態變種)resp答案之一:http://stackoverflow.com/a/7472723 – Puce 2013-03-05 16:04:46

+0

方法可能已被放入'對象',就像'克隆'和' Cloneable'。但是,看看爲什麼'Serializable'不應該是一個類,爲什麼'Cloneable'是一個糟糕的主意。 – 2013-03-05 18:15:04

+0

這就是爲什麼任何接口不是一個類的原因。以免限制你可以繼承的東西。 – EJP 2013-03-05 23:02:43

回答

12

因爲那麼你真的搞砸了,如果你想從繼承另一個類並實現Serializable。這是Java在選擇不支持真正的多重繼承時所做的一般權衡。你會注意到Java 2.0語言(Groovy和Scala)通過他們稱之爲traits或mixins的方式顛倒了這個決定 - 這幾乎是正好這樣設計的,所以你可以「混入」例如如果沒有邏輯地從它衍生出來,你可能會將其作爲證據表明你做出了一個非常好的觀點,並且Java會很好地聽取你的意見。

+0

恩,是的,當然,這很明顯......我不知道爲什麼我在發佈問題之前沒有考慮它。非常感謝! – sp00m 2013-03-05 15:54:46

+0

由於它是一個接口,因此可以將讀取/寫入對象的方法簽名添加到它,但是那樣會需要一個實際上不必要的實現。 – eipark 2013-04-01 20:07:34

4

如果java.io.Serializable會是一個類,那麼您將無法繼承其他基類。

換句話說,它是繼承或序列化。

相關問題