Question

J'ai un paquet avec un

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

et ceux-ci

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

Les utilisateurs du paquet besoin de joueurs, mais afin d'utiliser le paquet sans le casser, je besoin qu'ils ne directement étendre joueur. Au contraire, ils devraient étendre l'une des sous-classes fournies.

Question: Comment dois-je empêcher les utilisateurs d'étendre directement lecteur

Je suis à la recherche d'une manière qui le rend évident que cette interdiction vise.

Était-ce utile?

La solution

Faire les constructeurs dans Player ont accès paquet uniquement. Ensuite, ils ne seront pas en mesure d'appeler le constructeur ou l'étendre eux-mêmes. Si vous ne avez pas déjà Vous un constructeur explicite dans Player, créez un (sinon le compilateur crée un constructeur par défaut parameterless public).

(Notez que je ne l'ai proposai faire cela à la constructeur . La classe elle-même peut être public afin que les clients peuvent utiliser encore.)

Cela fonctionne parce que tout constructeur (autre que dans java.lang.Object) doit appeler un constructeur superclasse (explicitement ou implicitement). S'il n'y a pas de constructeurs accessibles, vous ne pouvez pas créer la sous-classe.

Autres conseils

Assurez-vous que les constructeurs du joueur ne sont pas publiques:

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

Ensuite, les classes peuvent étendre Player à partir dans le même paquet, mais ne devrait pas être en mesure de l'extérieur de l'emballage.

Um ... faire la classe du joueur non-public? Il suffit de laisser « public », alors il sera paquet-privé, à savoir que les classes dans le même package peut l'étendre.

Cependant, rien n'empêche carrément les gens de mettre leurs propres classes dans ce package. Je crois qu'il est possible de l'empêcher en le mettant dans un JAR signé, toute tentative de charger une classe non signé (ou différemment signé) dans le même package échouera.

Je vous recommande

  • Créer des interfaces publiques pour les choses que vous voulez que les clients d'accéder, mais pas créer ou sous-classe
  • Créer des classes publiques pour les choses que vous voulez que les clients d'accéder à et créer ou sous-classe
  • quoi que ce soit d'autre ne devrait pas être public

Le problème avec cette approche est que vous vous retrouvez avec tout besoin d'être dans un seul paquet, ce qui est mauvais pour l'organisation que la bibliothèque se développe.

Pour permettre l'utilisation de plusieurs paquets avec protection, jetez un oeil à OSGi.

OSGi vous permet de limiter ce qui emballe un paquet (pot) permet à d'autres faisceaux d'accès, et même mis en place des paquets « amis » qui sont autorisés une visibilité supplémentaire.

Java modèle paquet comme protection unité ne suffit pas quand vous voulez vraiment protéger les bibliothèques qui obtiennent un grand ...

Utilisez le modificateur d'accès par défaut, également connu sous le nom d'accès « paquet privé ». En d'autres termes, ne spécifiez pas un modificateur d'accès

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

La de href="http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html" ici sur le site Web de Sun décrit tous les modificateurs d'accès de manière plus détaillée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top