2009-07-06 5 views
34

Je suis un débutant et vient d'apprendre que si je dis définisQuel est le but de la définition d'un paquet dans un fichier Java?

package my.first.group.here; 
... 

alors les fichiers Java qui sont dans ce paquet sera placé sous le répertoire my/first/group/here.

Quel est le but principal de mettre des fichiers Java dans un paquet? Aussi, si je choisis d'adopter cela, comment dois-je les regrouper?

Merci


EDIT: Pour toute personne qui pourrait avoir la même question, je viens de trouver this tutorial on packages de Sun.

Répondre

32

Commençons par la définition d'un "package Java", comme décrit dans le Wikipedia article:

package A Java est un mécanisme pour organiser des classes Java dans espaces de noms similaires aux modules de Modula. Les packages Java peuvent être stockés dans des fichiers compressés appelés fichiers JAR, , ce qui permet de télécharger des classes plus rapidement que un groupe plutôt qu'un à la fois. Les programmeurs utilisent également généralement des packages pour organiser des classes appartenant à dans la même catégorie ou fournissant des fonctionnalités similaires.

Donc, sur cette base, paquets en Java sont tout simplement un mécanisme utilisé pour organiser des cours et de prévenir les collisions de noms de classe.Vous pouvez les nommer tout ce que vous voulez, mais Sun a publié une naming conventions que vous devrait utiliser lorsque les paquets de nommage:

paquets

Le préfixe d'un nom unique de l'emballage est toujours écrit dans tous les -ces lettres ASCII et devrait être l'un des noms de domaine de premier niveau, actuellement com, edu, gov, mil, net, org, ou l'un des anglais codes à deux lettres identifiant pays comme spécifier ed dans la norme ISO 3166, 1981.

composants ultérieures du paquet nom varie selon les propres les conventions de nommage internes d'une organisation . De telles conventions peuvent spécifier que certains composants du nom de répertoire soient division, département, nom de projet, de machine ou de connexion.

Exemples:

  • com.sun.eng

  • com.apple.quicktime.v2

  • edu.cmu.cs.bovik.cheese

0

Sur la page Wikipedia sur le sujet:

« Un package Java est un mécanisme pour l'organisation des classes Java dans les espaces de noms similaires aux modules de Modula packages Java peuvent être stockés dans des fichiers compressés appelés fichiers JAR, ce qui permet des cours. pour télécharger plus rapidement en tant que groupe plutôt qu'un à la fois.Les programmeurs utilisent généralement des paquets pour organiser des classes appartenant à la même catégorie ou offrant des fonctionnalités similaires. "

4

Il permet au programme d'être composé à partir de plusieurs programmes/composants/bibliothèques différents, de sorte que leurs noms de classes ne soient pas en conflit et que les composants soient plus faciles à organiser. Voir http://java.sun.com/docs/books/tutorial/java/package/index.html

En Java, il est courant de nommer les paquets comme des noms de domaine inversés. Par exemple, si le nom de domaine de votre société est "initech.com" et que vous créez un programme appelé "Gizmo", les noms de package sont généralement préfixés "com.initech.gizmo", avec des sous-packages pour différents composants du programme.

2

Les packages sont importants pour donner de la flexibilité à la séparation des classes. Ils peuvent être utilisés pour:

  • séparant les projets
  • séparant les modules
  • couches d'application de séparation (entreprises, web, dao)
  • plus de séparation plus fine de code à grains

Par exemple

com.mycompany.thisproject.thismodule.web

Pourrait indiquer la couche Web d'un module.

10

Je suis une grande application, vous devez avoir deux fichiers nommés exactement les mêmes (java.util.Date et java.sql.Date), en particulier lorsque vous commencez à apporter des jars tiers. Donc, fondamentalement, vous pouvez utiliser des paquets pour assurer l'unicité. À mon avis, l'empaquetage décompose les projets en segments significatifs. Donc, mon paquetage SQL contient du code SQL, et mon paquet logger gère la journalisation.

+1

"... vous pouvez utiliser des paquets pour assurer l'unicité ...." exactement à droite. Le terme faussant est «partitionner l'espace de noms global». Votre citation de java.util.Date et java.sql.Date est sur place. – duffymo

0

également, si je choisis d'adopter ceci, comment dois-je les regrouper?

Cela dépend en grande partie du (des) modèle (s) de conception que vous utiliserez dans votre projet.Pour la plupart (en particulier, si vous êtes nouveau), vous voudrez les regrouper par fonctionnalité ou par une autre similitude logique.

+0

Aussi, j'ajouterais que "choisir d'adopter" n'est pas vraiment une option, "doit adopter" est plus la réalité. En général, laisser des classes dans le paquet "default" est mal vu. – cjstehno

0

Java est très précis dans sa mise en œuvre. Cela ne laisse pas vraiment de place au fudging.

Si tout le monde utilisait le même paquetage, ils devraient trouver un moyen "mondial" pour s'assurer qu'aucun nom de classe ne soit entré en collision.

Cela permet à chaque classe jamais écrite d'entrer dans son propre "lieu" que vous n'avez pas à regarder si vous ne le souhaitez pas.

Vous pouvez avoir différents objets "Point" définis à 4 endroits différents sur votre système, mais votre classe utilisera seulement celle que vous attendez (parce que vous l'importez). La façon dont ils s'assurent que tout le monde a son propre espace est d'utiliser votre domaine inverse, donc le mien est "tv.kress.bill". Je possède ce domaine - En fait, je le partage avec mon frère "tv.kress.doug" et même si nous partageons le même domaine, nous ne pouvons pas avoir une collision.

Si une centaine de divisions de votre entreprise se développent chacune en Java, elles peuvent le faire sans collision et savoir exactement comment le diviser.

Les systèmes qui ne font pas ce genre de division me semblent vraiment flou maintenant. Je pourrais les utiliser pour pirater un script pour quelque chose de personnel, mais je me sentirais mal à l'aise de développer quelque chose de grand sans un emballage strict.

0

D'autres personnes ont fourni des réponses très spécifiques à Java, mais voici une analogie: pourquoi organisez-vous des fichiers dans des répertoires sur votre disque dur? Pourquoi ne pas simplement avoir un système de fichiers plat avec tout dans un seul répertoire?

La réponse, bien sûr, est que les paquets fournissent l'organisation. La partie du programme qui s'interface avec la base de données est différente de la partie du programme qui affiche une interface utilisateur à l'utilisateur, de sorte qu'ils seront dans des packages différents. Comme les répertoires, il fournit également un moyen de résoudre les conflits de noms. Vous pouvez avoir un temp.txt dans deux répertoires différents de la même manière que vous pourriez avoir deux classes qui apparaissent dans des paquets différents. Cela devient important (1) lorsque vous commencez à combiner du code avec d'autres personnes sur Internet ou (2) vous vous rendez compte même de la façon dont fonctionne la classification de Java.

0

Une autre chose importante à propos des packages est le membre protected pour le contrôle d'accès.

Protégé est quelque part entre public (tout le monde peut accéder) et privé (seul accès interne de classe). Les choses marquées comme protégées peuvent être accédées depuis le même paquet ou depuis des sous-classes. Cela signifie que pour un accès limité, vous n'avez pas à tout mettre dans la même classe.

3

En plus de l'espace de nommage mentionné dans les autres réponses, vous pouvez limiter l'accès aux méthodes et champs en fonction de la portée déclarée sur ce membre. Les membres ayant la portée publique sont librement accessibles, pour limiter l'accès, vous les définissez normalement comme privé (c'est-à-dire caché en dehors de la classe). Vous pouvez également utiliser la portée protégée pour limiter l'accès au type et à ses enfants. Il existe également la portée par défaut (un membre sans qualificatif a la portée par défaut) qui permet aux types enfants et types dans le même package d'accéder au membre.Cela peut être un moyen efficace de partager des champs et des méthodes sans les rendre trop largement disponibles, et peut aider à tester.

Par exemple, la méthode ci-dessous serait visible par tous les autres membres du même package.

public class Foo { 
    int doSomething() { 
     return 1; 
    } 
} 

Pour tester la méthode que vous pouvez définir un autre type dans le même package (mais probablement un emplacement autre source), ce type serait en mesure d'accéder à la méthode.

public class FooTest { 
    @Test 
    int testDoSomething() { 
     Foo foo = new Foo(); 
     assertEquals(1, foo.doSomething()); 
    } 
} 
1

Finalement, il y a 3 raisons principales que nous voulons utiliser des paquets en Java.

1) plus facile d'entretien

Organisation classes en packages suit la séparation des préoccupations principales par encapsulation et permet une meilleure cohésion dans la conception globale du système. En allant plus loin, l'empaquetage par caractéristique permet aux équipes de développeurs de trouver des classes et des interfaces pertinentes pour effectuer des changements, en supportant des techniques de découpage vertical pour des approches à l'échelle utilisées dans la méthodologie agile. Pour plus d'informations, consultez le blog: Package your classes by Feature and not by Layers et Coding: Packaging by vertical slice.

2) Assurer la sécurité Paquet

paquets permettent un accès externe à seulement public modificateurs d'accès sur les méthodes dans les classes contenues. En utilisant le protected ou aucun modificateur ne sera accessible aux classes dans le même paquet. Pour plus d'informations, voir le post: Which Java access modifier allows a member to be accessed only by the subclasses in other package?

3) Évitez similaires nommer

similaires aux espaces de noms de .NET, les noms de classe sont contenus dans le cadre de leur paquet contenant. Cela signifie que deux packages mutuellement exclusifs peuvent contenir des classes portant le même nom. C'est parce que les paquets eux-mêmes ont des noms différents et, par conséquent, les noms complets sont différents. Pour plus d'informations, voir le tutoriel [Nommer un package: les tutoriels Java] [3].

Questions connexes