Packages
Packages são usados para agrupar unidades de código relacionadas. Contêm classes Java organizadas de forma a identificar as relações que existem nas suas funcionalidades.
Ao contrário de outras linguagens1, em Java os packages representam estruturas de directórios que necessitam existir em disco. Um package representa sempre um conjunto de pastas que contém os ficheiro de código fonte Java, e posteriormente, os ficheiros compilados.
Essa característica impões algumas restrições à forma como as classes podem ser organizadas. Duas classes precisam estar dentro da mesma pasta no disco para poderem estar no mesmo package.
O package a que uma classe pertence definem também o nome completo da classe. Desta forma, o nome completo de uma classe é o nome de todas as pastas, desde a raiz2. Por exemplo, a classe String tem como nome completo o nome java.lang.String.
Para indicar a que package pertence, uma classe usa a primeira linha de código no seu ficheiro de código fonte com a estrutura:
package java.lang;
Como podem ver, as pastas que constituem um package são especificadas separando cada uma por um ponto. Se olharmos para a estrutura no disco do código fonte da plataforma Java, podemos ver que dentro da pasta src existe um pasta chamada java, que contém, entre outras, a pasta lang, e é dentro dessa pasta que encontramos a classe String.
Em Java, uma classe pertence sempre a um package, se não for especificado nenhuma instrução para identificar o package e a classe está dentro de alguma pasta que seja sub-pasta de src, então o compilador apresentará um erro e essa classe não compilará. Se não for indicado o package, e a classe estiver directamente dentro da pasta src, então essa classe pertence ao package default.
O sistema de packages permite agrupar classes com comportamento similar, mas também identificar de forma inequívoca uma classe. Isto porque se nos lembrarmos de uma das características da plataforma Java, o Java é distribuído, permite carregar uma classe a partir da rede e nesse cenário é bastante fácil dois programadores criarem classes diferentes com o mesmo nome, e alguém as tentar usar no mesmo sistema. Se forem criados packages únicos, então essas classes nunca irão entrar em conflito já que o seu nome completo é diferente.
Por este motivo é desaconselhado que sejam criadas classes no package default.
Mas se é fácil alguém criar classes com o mesmo nome, não será igualmente fácil dois programadores escolherem a mesma estrutura de directórios e assim, o mesmo package? Para evitar essa situação, é comum criarem-se packages usando o domínio de Internet do projecto, invertendo os nomes. Por exemplo, todos os ficheiros de código fonte Java, criados para este tutorial, possuem como package o valor org.pap.wiki.tutorial, que pretende representar o domínio usado para aceder à wiki, nomeadamente wiki.portugal-a-programar.org.
É necessário ter em atenção que existem algumas limitações nos nomes que podem ser dados aos packages:
- nomes não devem necessitar de distinção maiúsculas/minúsculas já que para alguns sistemas operativos, uma pasta com o nome java e Java resultam na mesma pasta.
- símbolos especiais não devem ser usados.
- não se devem começar nomes de packages com números.