Warum sollten Klassen, die für die Vererbung entworfen wurden, selten die Serializble-Schnittstelle implementieren?

8

Laut Effektivem Java:

  

Klassen, die für die Vererbung entworfen wurden, sollten Serializable,   und Schnittstellen sollten es selten erweitern.

Was ist der Grund für diese Aussage? Mit anderen Worten, was wären die Probleme, wenn sie eine serialisierbare Schnittstelle implementieren?

    
Geek 05.06.2013, 17:57
quelle

3 Antworten

7

Der nächste Satz im selben Artikel sagt es:

  

Klassen, die für die Vererbung (Punkt 17) entwickelt wurden, sollten selten Serializable implementieren, und Schnittstellen sollten sie selten erweitern. Die Verletzung dieser Regel stellt eine erhebliche Belastung für jeden dar, der die Klasse erweitert oder die Schnittstelle implementiert. Es gibt Zeiten, in denen es angemessen ist, die Regel zu verletzen. Wenn beispielsweise eine Klasse oder eine Schnittstelle hauptsächlich zur Teilnahme an einem Framework existiert, das die Implementierung von Serializable durch alle Teilnehmer erfordert, ist es sinnvoll, dass die Klasse oder Schnittstelle Serializable implementiert oder erweitert.

Da ich nicht möchte, dass Josh an meinem Schwanz steht, weil ich das Copyright verletzt habe (so cool das auch sein mag), würde ich nicht alle Elemente dieser Antwort kopieren. Es genügt zu sagen, dass die Begründung dafür im Rest des Artikels erklärt wird.

EDIT: Josh hat eine Reihe von Kosten für die Implementierung von Serializable aufgelistet. Wenn eine Schnittstelle / Oberklasse es implementiert, werden die Kosten auf die erweiterten Klassen erzwungen.

  

Eine wesentliche Kosten für die Implementierung von Serializable ist, dass es die   Flexibilität, um die Implementierung einer Klasse zu ändern   freigegeben. ...

     

...

     

Eine zweite Kosten für die Implementierung von Serializable ist, dass es erhöht   Wahrscheinlichkeit von Bugs und Sicherheitslücken. ...

     

Eine dritte Kosten für die Implementierung von Serializable ist, dass es erhöht   Testbelastung im Zusammenhang mit der Freigabe einer neuen Version einer Klasse.

    
Ziyao Wei 05.06.2013, 18:01
quelle
7

Wenn eine Basisklasse oder Schnittstelle Serializable implementiert, wird jede Unterklasse oder Implementierung gezwungen, den Vertrag der Oberklasse oder Schnittstelle zu erfüllen, um sicherzustellen, dass die Unterklasse oder Implementierung auch serialisierbar ist.

Dies verhindert, dass eine Implementierung Felder hinzufügt, die nicht flüchtig und nicht serialisierbar für ihre Implementierung sind, zum Beispiel.

    
JB Nizet 05.06.2013 18:04
quelle
0

Alle Subtypen einer serialisierbaren Klasse sind selbst serialisierbar wie hier .So Wenn Sie eine Klasse für die Vererbung serialisieren möchten, sollten Sie wissen, ob alle Unterklassen serialisiert werden müssen. Andernfalls können Sie nur die erforderlichen Unterklassen serialisieren.

    
Sanjaya Liyanage 05.06.2013 18:04
quelle

Tags und Links