Masquage des classes dans un fichier jar
Est-il vraiment impossible de cacher certaines classes dans un fichier jar?
Je voulais de ne pas autoriser direct de l'instanciation des classes pour le garder plus souple. Seule l'usine (ou façade) doit être visible de ce pot.
Est-il un autre moyen de résoudre ce problème que la création de deux projets?
(Deux projets: le premier contient les classes (mise en œuvre) et de l'autre les références à la première, et contient de l'usine; plus tard seulement, la seconde va être référencé)
Je ne suis pas sûr de ce que tu veux dire par "se cacher". Les fichiers Jar sont juste .les fichiers zip, donc n'importe qui peut les ouvrir et voir vos fichiers de classe à l'intérieur d'eux.
Je veux juste éviter que les classes peuvent être utilisés à l'extérieur (par hasard) au moment de l'instanciation.
Je ne pense que vous devriez faire confiance à l'utilisateur de vos classes et de fournir assez décent de la documentation à ce que l'utiliser et de ne pas le faire. Il n'y a aucune façon vous pouvez éviter toutes les erreurs des développeurs utilisant vos bocaux peuvent venir de toute façon. Une alternative est évidemment juste pour faire votre propre constructeurs tellement complexe que personne ne peut les comprendre et revient naturellement à l'usine classes 😀
Aussi je ne pense pas qu'il n'y a point dans l'ajout de ce type de flexibilité jusqu'à ce qu'il est vraiment servir à quelque chose. Et juste pour la flexibilité, vous pourriez peut-être envisager l'Inversion de Contrôle des frameworks comme Spring (ou quelque chose de plus léger selon vos besoins).
C++ vs Java: 2-0
Je veux juste éviter que les classes peuvent être utilisés à l'extérieur (par hasard) au moment de l'instanciation.
Je ne pense que vous devriez faire confiance à l'utilisateur de vos classes et de fournir assez décent de la documentation à ce que l'utiliser et de ne pas le faire. Il n'y a aucune façon vous pouvez éviter toutes les erreurs des développeurs utilisant vos bocaux peuvent venir de toute façon. Une alternative est évidemment juste pour faire votre propre constructeurs tellement complexe que personne ne peut les comprendre et revient naturellement à l'usine classes 😀
Aussi je ne pense pas qu'il n'y a point dans l'ajout de ce type de flexibilité jusqu'à ce qu'il est vraiment servir à quelque chose. Et juste pour la flexibilité, vous pourriez peut-être envisager l'Inversion de Contrôle des frameworks comme Spring (ou quelque chose de plus léger selon vos besoins).
C++ vs Java: 2-0
OriginalL'auteur nrainer | 2011-01-21
Vous devez vous connecter pour publier un commentaire.
Je pense que vous aurez soit compilateur échec ou d'avertissement si votre méthode de fabrique d'essayer quelque chose qui est "caché".
Non, vous ne pouvez pas cacher une classe publique sans réimplanter votre propre
ClassLoader
ou à l'aide de OSGi ou quelque chose de similaire.Ce que vous pouvez faire est de séparer l'interface de l'api à partir de la mise en œuvre, par exemple, un projet qui ne contient que les interfaces et l'autre porject qui contient les implmentations. Cependant, vous ne pouvez toujours pas masquer la mise en œuvre des classes.
OriginalL'auteur gigadot
Je comprends que vous ne cherchez pas à cacher les classes réelles, tout simplement empêcher leur construction à l'extérieur d'une usine de classe. Cela, je pense peut être très facilement obtenus en utilisant colis privé (par défaut) de la visibilité dans les constructeurs de classe. La seule limitation est que vous aurez besoin d'avoir les classes et l'usine dans le même package, donc dans un milieu de grande base de code, les choses peuvent se inutilement complexe.
Vous l'avez. Mais la limitation est exactement le problème. Il existe de nombreuses classes et je ne veux vraiment pas mettre tout dans un seul paquet.
Mikko: votre commentaire: Que pourrait être résolu par une étanchéité de l'emballage.
OriginalL'auteur Mikko Wilkman
Si je comprends votre question correctement, vous souhaitez assurez-vous que les utilisateurs de votre bibliothèque sont contraints d'utiliser votre usine pour instancier les objets plutôt que d'utiliser les constructeurs eux-mêmes.
Comme je le vois, il y a deux possibilités, ce qui est idiot, mais utilisable dans quelques cas spécifiques, et l'autre est le plus pratique et probablement le plus couramment utilisé façon de le faire.
intérieure privée les classes de l'
usine. Cela ne peut fonctionner que si vous aviez
une usine par classe, mais n'est guère
réalisable si vous avez beaucoup de
les différentes classes géré
grâce à une usine.
protected
modificateur d'accès àrestreindre l'accès à votre classe
les constructeurs. Ce qui est commun
pratique lors de l'utilisation de la usine
modèle.
Je l'ai utilisé dans les cas où vous avez une usine pour une seule classe avec beaucoup d'instanciation d'options, mais d'autres que dans ce cas précis, il n'est pas conseillé.
OriginalL'auteur Mia Clarke
la Dissimulation de l' peut vous aider à en quelque sorte.
@Elie quelque
Donc "détachées" et +1
Ok, merci pour ta réponse. Cependant, je pense que c'est exagéré à mon exigence.
OriginalL'auteur Jigar Joshi
Avec la norme chargeurs de classes d'une plaine de vieux fichiers jar ce n'est pas possible. OSGi cas ce concept de rendre visible à un autre bundle seulement quelques paquets et pas d'autres (c'est à dire la séparation de l'api publique et la mise en œuvre interne).
Si vous êtes usinf eclipse vous pouvez appliquer ces règles avec cette
OriginalL'auteur lweller
Si je vous comprends bien quand vous dites "ne pas autoriser direct de l'instanciation des classes pour le garder plus flexible", a correctement exécuté façade motif de gérer cela.
Limiter les constructeurs de toutes les classes que vous voulez cacher à portée de package. Ouvrez la façade de la classe de portée publique.
http://mindprod.com/jgloss/packagescope.html
Je n'ai pas expérimenté, mais vous devriez être capable de mettre vous êtes à la façade de la classe dans un package et vous avez votre mise en œuvre de classes chez les enfants de paquets. De cette façon, la façade et la mise en œuvre de classes sont toutes dans le même paquet et vous obtenez l'organisation d'un grand nombre de paquets.
Autant que je sache pck1.subPck1 n'a rien à voir avec pck1. Donc je ne pense pas que cela va fonctionner. (Les espaces de noms en C# permet. De toute façon, si j'ai utilisé le C#, je n'aurais pas ce problème parce que de l'intérieur de l'modificateur qui permettrait de résoudre mon problème.)
+1 cela semble être la façon la plus simple. tout simplement de faire du "String str;" au lieu de " public/privé/protégé String str;'
OriginalL'auteur Speck
Il y a deux solutions à votre question qui n'impliquent pas de garder toutes les classes du même package.
La première est d'utiliser l'Ami de l'Accesseur/Ami Package modèle décrit dans (Pratique de Conception d'API, Tulach 2008).
La seconde est d'utiliser OSGi. Il y a un article ici expliquant comment OSGi accomplit ce.
Questions connexes: Un, Deux, Trois, et Quatre.
OriginalL'auteur Jeff Axelrod
Vous pouvez faire de telles magies avec un chargeur de classe mais:
Dans de telles situations, je voudrais faire quelque chose de similaire à ce que nous pouvons voir dans le standard de Java. E. g.vous voyez
javax.xml.stream.XMLInputFactory
mais quelque part, vous avezcom.sun.xml.internal.stream.XMLInputFactoryImpl
. Il est parfaitement compilable si vous écrivez:bien que vous aurez du mal à le faire 🙂 Avec un système de propriété que vous pouvez contrôler la mise en œuvre réelle qui est en cours de chargement. Pour moi, une telle approche est bien dans de nombreuses situations.
J'espère avoir bien compris votre question 😉
Cheers!
OriginalL'auteur Lachezar Balev