web-dev-qa-db-fra.com

Quel est le but de définir un package dans un fichier Java?

Je suis un débutant et viens d'apprendre que si je définis dis

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

alors les fichiers Java qui se trouvent dans ce package seront placés sous my/first/group/here répertoire.

Quel est le but principal de mettre des fichiers Java dans un package? De plus, si je choisis de l'adopter, comment dois-je les regrouper?

Je vous remercie


EDIT: Pour tous ceux qui pourraient avoir la même question à nouveau, je viens de trouver ce tutoriel sur les packages de Sun.

47
derrdji

Dans le cas d'une grande application, vous devez obligatoirement avoir deux fichiers nommés exactement de la même manière (Java.util.Date et Java.sql.Date), en particulier lorsque vous commencez à importer des fichiers tiers. Donc, fondamentalement, vous pouvez utiliser des packages pour garantir l'unicité.

Plus important encore, à mon avis, l'emballage décompose les projets en segments significatifs. Mon package SQL contient donc du code lié à SQL, et mon package de journalisation gère la journalisation.

14
geowa4

Il permet au programme d'être composé de plusieurs programmes/composants/bibliothèques différents, afin que leurs noms de classe n'entrent pas en conflit et que les composants soient plus faciles à organiser. Voir http://Java.Sun.com/docs/books/tutorial/Java/package/index.html

Dans Java il est habituel de nommer les packages en tant que noms de domaine inversés. Par exemple, si le domaine de votre entreprise est "initech.com" et que vous créez un programme appelé "Gizmo", les noms des packages sont généralement préfixé "com.initech.gizmo", avec des sous-packages pour différents composants du programme.

4
Esko Luontola

En plus de l'espace de noms mentionné dans d'autres réponses, vous pouvez limiter l'accès aux méthodes et aux champs en fonction de la portée déclarée sur ce membre. Les membres avec la portée public sont librement accessibles, pour limiter l'accès, vous les définissez normalement comme private (c'est-à-dire cachés en dehors de la classe). Vous pouvez également utiliser la portée protected 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 aux types du 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 aux tests.

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

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

Pour tester la méthode, vous pouvez définir un autre type dans le même package (mais probablement un emplacement source différent), ce type pourra accéder à la méthode.

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

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

  • séparation des projets
  • modules de séparation
  • séparation des couches d'application (business, web, dao)
  • séparation de code plus fine

Par exemple

com.mycompany.thisproject.thismodule.web

Pourrait indiquer la couche Web d'un module.

2
Mercer Traieste

En fin de compte, il y a 3 raisons principales pour lesquelles nous voulons utiliser des packages en Java.

1) Maintenance plus facile

L'organisation de classes en packages suit le principe de séparation des préoccupations par encapsulation et permet une meilleure cohésion dans la conception globale du système. En allant plus loin, l'empaquetage par fonctionnalité permet aux équipes de développeurs de trouver des classes et des interfaces pertinentes pour apporter des modifications, prenant en charge les techniques de découpage vertical pour les approches évolutives utilisées dans la méthodologie agile. Pour plus d'informations, consultez l'article de blog: Empaquetez vos classes par entité et non par couches et Codage: empaquetage par tranche verticale .

2) Assurer la sécurité du package

Les packages n'autorisent l'accès externe qu'à public modificateurs d'accès aux méthodes des classes contenues. L'utilisation du modificateur protected ou d'aucun modificateur ne sera accessible qu'aux classes du même package. Pour plus d'informations, consultez l'article: Quel Java autorise l'accès à un membre uniquement par les sous-classes d'un autre package?

3) Évitez les noms similaires

Semblables aux espaces de noms de .NET, les noms de classe sont contenus dans la portée de leur package contenant. Cela signifie que deux packages s'excluant mutuellement peuvent contenir des classes du même nom. En effet, les packages eux-mêmes ont des noms différents et, par conséquent, les noms complets sont différents. Pour plus d'informations, voir le didacticiel [Nommer un package: les Java Tutorials] [3].

2
newmanicspree

De la page Wikipedia sur le sujet:

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

0
Paul Sonier

aussi, si je choisis de l'adopter, comment dois-je les regrouper?

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

0
Yohnny

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

Si tout le monde devait utiliser le même package, ils devraient trouver un moyen "mondial" de s'assurer qu'aucun nom de classe ne se heurte jamais.

Cela permet à chaque classe jamais écrite de s'insérer dans son propre "endroit" 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 n'utilisera que celui que vous attendez (car vous l'importez).

La façon dont ils s'assurent que chacun 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 de collision.

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

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

0
Bill K

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

Protégé se situe entre public (tout le monde peut y accéder) et privé (seule la classe interne peut y accéder). Les éléments marqués comme protégés sont accessibles à partir du même package ou de sous-classes. Cela signifie que pour un accès limité, vous n'avez pas à tout mettre dans la même classe.

0
Tamar