2014-12-18 5 views
6

Ich habe eine Frage zu einem hinterhältigen Weg, um Zugang zu Paketzugangsmitgliedern zu erhalten, die mir einfielen. Insbesondere möchte ich eine Klasse erweitern - nennen wir sie com.acme.Foo -, um einige Funktionen hinzuzufügen. Dies ist eine reine Addition: Alle aktuellen Methoden von Foo würden nur durch Delegieren an die Superklassenmethode unterstützt. Es gibt jedoch keinen barrierefreien Konstruktor von Foo, daher kann ich die Klasse nicht erweitern und meine Implementierung wird den "isA" -Test nicht als Foo bestehen. Es gibt keine Schnittstelle, die Foo -ness ausdrückt, die ich anstelle der Vererbung verwenden kann. DieseZugang zu Paketzugriffsmembern erhalten, indem der gleiche Paketname erstellt wird

ist, wo der hinterhältigen Gedanke kam mir der Gedanke: Foo ein Paket-Zugang Konstruktor hat, warum also nicht nur ein Paket com.acme in meinem Quellordner erstellen und erstellen Sie eine InheritableFoo Klasse in diesem Paket:

package com.acme; 

public class InheritableFoo extends Foo { 
    public InheritableFoo() { 
     super(); 
    } 
} 

Jetzt kann ich meine Erweiterung zu Foo durch Erweitern InheritableFoo implementieren, da dies einen barrierefreien Konstruktor hat.

Das fühlt sich alles falsch an, und irgendwie unethisch: Ich respektiere nicht die Entscheidung, die der ursprüngliche Programmierer traf, als er oder sie sich entschied, keinen Konstruktor für Foo freizugeben. Aber es könnte sein, dass sie einfach den Ansatz "alles leugnen, bis es einen Grund dafür gibt" angenommen haben. Wie auch immer, gibt es irgendetwas grundsätzlich falsch mit dieser Idee? Werde ich mir in der Zukunft Probleme machen, wenn ich diesen Weg gehe, und wenn ja, warum?

Antwort

1

Sie haben Recht damit, dass Sie sich in einer eigenen Klasse in ein anderes Paket "schleichen" können und Zugriff auf paketbeschränkte Elemente erhalten.

Dies wird jedoch nur so lange, wie der Autor com.acme.foo seinen Code als Quelle oder ein unversiegeltes Paket verteilen. Sollte der Autor dieses Pakets es als versiegeltes Glas verteilen (was ziemlich gewöhnlich ist, glaube ich), wird Ihr Ansatz nicht länger funktionieren.

Von Sealing Packages within a JAR File

Paketen innerhalb JAR-Dateien können optional abgedichtet werden, was bedeutet, dass alle in diesem Paket definierten Klassen müssen in der gleichen JAR Datei archiviert werden.