Les avantages et les inconvénients de colis privé, les classes en Java?
Je suis en train d'apprendre le Java récemment, et je suis tombé sur la notion de package-private
classes, ce qui est la valeur par défaut si l'on ne spécifie pas quoi que ce soit. Mais ensuite j'ai réalisé:
-
J'ai rarement voir l'utilisation de la trousse-classe privée. Est-il une raison pour cela, par exemple, il a de graves inconvénients, il est redondant, ou tout simplement je ne suis pas la lecture assez? Sont il y a de solides arguments pour/contre son utilisation?
-
Si ce n'est pas vraiment utile dans la plupart des cas, pourquoi en serait-il par défaut?
-
Dans quelle situation faut-il utiliser colis-privé dans le monde réel? I. e., quand serait-elle irremplaçable?
En d'autres termes, quels sont les principaux avantages et inconvénients du package par défaut-privé modificateur?
Vous devez vous connecter pour publier un commentaire.
La réponse courte est - elle est un peu plus large que la forme de privé.
Je vais supposer que vous êtes familier avec la distinction entre
public
etprivate
, et pourquoi il est généralement une bonne pratique pour faire des méthodes et des variablesprivate
si ils vont être utilisées uniquement en interne à la classe en question.Bien, comme une extension de celle - là, si vous songez à la création de votre logiciel de façon modulaire, vous pourriez penser à un public d'interface à votre module, qui aura plusieurs classes à l'intérieur de collaboration entre eux. Dans ce contexte, il est parfaitement logique de faire des méthodes
public
si ils vont être appelés par les consommateurs;private
si elles sont internes à une classe; etpackage private
si ils sont utilisés pour les appels entre les classes de ce module, c'est à dire que c'est un détail de l'implémentation de votre module (tel que vu par le public, les appelants), mais s'étend sur plusieurs classes.Ce n'est que rarement utilisé dans la pratique, parce que le système de paquets s'avère ne pas être si utile pour ce genre de chose. Vous devez vider toutes les classes pour un module donné dans exactement le même paquet, qui pour quoi que ce soit non trivial va devenir un peu lourd. Donc, l'idée est excellente - faire une méthode accessible à seulement une poignée de "proximité" classes à la fois, un peu plus large
private
- mais les restrictions sur la façon de définir l'ensemble des classes signifie qu'il est rarement utilisé et/ou utiles.protected
modificateur est le même quepackage private
sauf que les sous-classes sont également invités à la fête. Mais il serait faux de créer une relation de sous-classe (juste pour des fins d'accès) si l'on n'existent pas naturellement. Il ne serait généralement pas faire aucun sens, par exemple, unEmailSender
classe pour être une sous-classe d'uneDomainObjectFilter
classe ou vice versa. Dans cette situation, la méthode est généralement juste faitpublic
(peut-être avec un commentaire disant que ce n'est pas conceptuellement public...).Une bonne chose à propos de colis-privé est que vous pouvez l'utiliser pour donner accès à des méthodes de vous éviter d'envisager privé à l'unité de classes de test. L'inconvénient étant bien sûr que les autres classes dans le package pourrait l'appeler quand ils ont vraiment ne devrait pas.
En dehors de l'encapsulation, l'un des principaux avantages de l'utilisation du package privée les classes, c'est qu'ils n'apparaissent pas dans la javadoc de votre projet. Donc, si vous utilisez des classes d'assistance qui n'ont pas d'autre usage, mais pour aider votre public des classes de faire quelque chose que les clients ont besoin, il est logique de les rendre colis privé que vous voulez garder les choses aussi simples que possible pour les utilisateurs de la bibliothèque.
Comme un exemple, vous pouvez avoir un coup d'oeil à une bibliothèque que j'ai développé. Le javadoc ne contient que 5 interfaces et 12 classes bien que le le code source a beaucoup plus. Mais ce qui est caché est la plupart du temps des couches internes qui n'apportent aucune valeur ajoutée pour le client (généralement toutes les classes de base abstraites sont cachés).
Il y a aussi de nombreux exemples dans le JDK.
Concernant la question du "pourquoi serait-il la valeur par défaut", dans ce contexte, le terme "défaut" signifie simplement l'absence d'un autre qualificatif. Je suppose qu'ils pourraient avoir inventé un autre mot clé ("package" était déjà pris), mais ils n'ont pas.
Dans le monde réel, j'utilise d'accès par défaut de l'utilitaire de classes et les classes abstraites que je ne veux pas que les gens appel ou autrement utiliser d'autres paquets. Disons que vous disposez d'une interface et de deux des implémentations concrètes qui s'étendent de certaines classe abstraite. Vous déclarez vos deux classes concrètes comme finale parce que vous n'avez pas forcément envie les gens à la sous-classe (voir Effective Java). Vous ne voulez pas que les gens de singe avec votre classe abstraite pour la même raison. Si vous utilisez d'accès par défaut pour la classe abstraite, alors les gens ne voient que si ils ont mis leur classe dans votre forfait. Ce n'est pas l'épreuve des balles, mais je pense que c'est une utilisation raisonnable/illustration d'accès par défaut. Cela dit, le fait qu'elle n'empêche pas les détails de la fuite comme privé serait, c'est à dire ne pas garantir quoi que ce soit, signifie qu'il n'est pas particulièrement utile de la convention.
Une autre raison pourquoi vous n'avez pas la voir plus souvent utilisé est que les gens ont tendance à exclure les classes d'accès par défaut à partir de leur documentation javadoc.
Le colis-privé, le niveau d'accès est plus restrictive que
protected
: protégé les attributs et les méthodes peuvent toujours être consultées par tout simplement sous-classement d'une classe. Protégé membres sont (ou peuvent être) destinés à la succession colis-privé, les membres ne sont pas.Colis-privé, les membres sont souvent utilisés de manière multilpe classes à l'intérieur d'un package peut accéder de mise en œuvre spécifiques attributs ou (utilitaire) méthodes.
De bons exemples de ce sont les colis-privé constructeur de
String
et laStringBuilder.value
char tableau:Donc les classes à l'intérieur de la
java.lang
package peut créer efficacement des nouvellesStrings
si le contenu est déjà présent dans unechar[]
sans compromettre la sécurité. Vous ne pouvez pas le faire à partir de votre application, car si vous le pouvez, vous aurez accès (de référence) à l'intérieur de la char tableau d'uneString
qui est immuable (réflexion ne compte pas!).Dans
StringBuilder
(ou plutôtAbstractStringBuilder
où la mise en œuvre vient de l') le char de la matrice de la tenue de la valeur actuellechar[] value
et une méthode d'accesseur pour cechar[] getValue()
sont aussi des colis-privé pour les différentes méthodes de l'utilitaire deString
commecontentEquals(StringBuffer sb)
etcontentEquals(CharSequence cs)
peuvent utiliser ce pour plus d'efficacité et plus rapide des comparaisons sans s'exposer à l'interne char tableau du "monde".1 - cela Dépend de l'architecture -Généralement si vous écrivez du code pour vous-même et sur de petits projets, vous n'auriez probablement pas l'utiliser. Dans les grands projets, il peut être utile de s'assurer que vous pouvez contrôler où et comment certaines méthodes sont appelées.
2 - par Défaut (I. e. pas public/protected/private) n'est pas la même privé de son 4e état. Voir Java De Contrôle D'Accès
3 - Il peut rendre la vie plus facile lorsque vous êtes à l'écriture de bibliothèques que vous ne voulez pas que des tiers, en s'appuyant sur la façon dont vous mettez en œuvre le code sous-jacent - vous venez de faire l'API elle-même publique.
S'il vous plaît notez que lorsque vous parlez de classes, vous n'avez que deux options:
Le concept de "classe" est dénuée de sens. (Pourquoi faire une classe qui n'est pas utilisé n'importe où?!)
Donc, si vous avez une classe pour les opérations intermédiaires qui n'ont pas à être exposés les utilisateurs de l'API que vous êtes censé déclarer comme "colis privé"
Également lorsque vous définissez le nombre de classes dans le même fichier source, une seule classe est autorisé à être public (son nom correspondait à la .java nom de fichier). Si une autre classe est définie dans le même fichier, elle doit être "colis privé".
"Colis Privé" est utilisé lorsque vous avez plusieurs paquets, et il signifie, d'autres classes du même package peut accéder à la classe ou le membre de la classe en tant que "public", de classes dans d'autres packages ne peuvent pas accès, comme son "privé comme eux."