Frage

Ich habe ein Paket mit einem

public abstract class Player { /*...*/ }

und diese

public abstract class GamePlayer extends Player { /*...*/ }
public abstract class TournamentPlayer extends Player { /*...*/ }
public abstract class StatelessPlayer extends Player { /*...*/ }

Benutzer des Pakets müssen Spieler aber, um das Paket zu verwenden, ohne es zu zerbrechen ich verlangen, dass sie nie direkt erweitert Player. Stattdessen sollten sie eine der Unterklassen erstrecken.

Frage: Wie soll ich verhindern, dass Benutzer sich von Spielern direkt

Ich bin auf der Suche nach einem Weg, der es offensichtlich, dass dieses Verbot macht soll.

War es hilfreich?

Lösung

Machen Sie die Konstrukteure in Player nur Paket Zugriff haben. Dann werden sie nicht in der Lage sein, den Konstruktor aufrufen oder es sich zu verlängern. Wenn Sie nicht bereits wurde ein expliziter Konstruktor in Player, erstellen Sie einen (wie sonst der Compiler einen Standard öffentlichen parameterlosen Konstruktor schaffen wird).

(Beachten Sie, dass ich nur diese vorschlagen tun, um die Konstruktor . Die Klasse selbst kann öffentlich sein, so dass die Kunden immer noch verwenden können.)

Das funktioniert, weil jeder Konstruktor (außer in java.lang.Object) einen Oberklassenkonstruktors (explizit oder implizit) zu nennen hat. Wenn es keine zugänglichen Konstrukteure sind, können Sie die Unterklasse nicht erstellt werden.

Andere Tipps

Stellen Sie sicher, dass die Konstrukteure des Spielers sind nicht öffentlich:

public abstract class Player {
    Player() {
        // initialization goes here
    }
}

Dann können Klassen Spieler aus dem gleichen Paket verlängern, sollen aber nicht von außerhalb des Pakets kann.

Um ... machen die Spielerklasse nicht-öffentlich? Nur auslassen „public“, dann wird es Paket-private sein, das heißt nur Klassen im gleichen Paket es erweitern können.

Allerdings hindert nichts geradezu Menschen aus ihren eigenen Klassen in dem Paket setzen. Ich glaube, es ist möglich, es zu verhindern, indem sie in eine signierten JAR setzt, dann jeder Versuch, eine nicht signierte (oder anders signierte) Klasse im gleichen Paket zu laden, wird fehlschlagen.

Ich würde empfehlen,

  • Erstellen Sie öffentliche Schnittstellen für Dinge, die Sie Clients zugreifen möchten, aber nicht erstellen oder Unterklasse
  • Erstellen Sie öffentliche Klassen für Dinge, die Sie Clients zugreifen möchten und erstellen oder Unterklasse
  • alles soll anders sein, nicht-öffentlich

Das Problem bei diesem Ansatz ist, dass Sie mit allem, was am Ende braucht in einem einzigen Paket zu sein, die für die Organisation schlecht ist, wie die Bibliothek wächst.

Um die Verwendung von mehreren Paketen mit Schutz zu ermöglichen, einen Blick auf OSGi nehmen.

OSGi können Sie einschränken, welche ein Bündel (jar) Pakete können andere Pakete auf Zugang, und sogar „Freund“ Bündel einrichten, die zusätzliche Sichtbarkeit erlaubt sind.

Java-Paket-as-Schutz-Unit-Modell ist nicht ausreichend, wenn Sie wirklich wollen Bibliotheken zu schützen, die groß werden ...

Verwenden Sie den Standard Zugriffsmodifikator, die auch als „-Paket privaten“ bekannt Zugang. Mit anderen Worten, geben Sie keinen Zugriffsmodifikator

abstract class Player { /*...*/ }

Die Dokumentation hier auf der Website von Sun wird beschrieben, alle der Zugriffsmodifikatoren näher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top