[picture]

Pacotes

Programação 3: Orientação a Objetos e Java


Para agrupar a definição de conceitos relacionados, Java suporta a noção de pacotes. Como vimos anteriormente, esta noção é a essência de modularização o que pode ser muito importante para facilitar tanto a reusabilidade quanto a estensibilidade (manutenção) de software.

Tipicamente um pacote em Java contém a definição de várias classes relacionadas, as quais podem estar distribuídas em várias unidades de compilação (arquivos do sistema operacional). Cada unidade de compilação deve ter no início a seguinte declaração:

package pacote;
onde pacote é o nome do pacote ao qual a unidade pertence.

Pacotes e Diretórios

Para a implementação atual de Java, as unidades de compilação de um pacote devem estar no mesmo diretório do sistema operacional. De fato, o nome (identificador) do pacote deve ser parte do nome deste diretório. Usando o sistema UNIX como exemplo, podemos definir um pacote chamado aulas.aula9 cujos arquivos estejam no diretório
/home/java/public_html/graduacao/aulas/aula9
assumindo que o compilador Java foi informado para procurar pacotes embaixo do diretório
/home/java/public_html/graduacao
Os monitores poderão informar como fazer isso tanto no ambiente UNIX quanto no ambiente Windows'95.

Apesar de um pacote corresponder a vários arquivos no mesmo diretório, note que se o diretório contém subdiretórios, estes não correspondem a "subpacotes". Por exemplo, um pacote chamado aulas.aula9.bancoar não tem nenhuma relação direta com o pacote aulas.aula9, apesar dos arquivos do primeiro estarem num subdiretório do diretório onde estão os arquivos do segundo.

Ocultando Informações

Pacotes são especialmente úteis para ocultar informações. Com este intuito, Java permite que as definições de métodos, atributos, construtores e classes sejam acompanhadas de qualificadores especiais: Por exemplo, veja como usar os qualificadores acima:
  public class Banco {
    private Conta[]       contas;
    ...
    public void cadastro(Conta c) {...} 
    ...
    protected Conta procura(long num) {...}
    ...
    public Banco () {...}
  }

Importação de Pacotes

As declarações feitas em uma unidade de compilação são visíveis em qualquer outra unidade do mesmo pacote, a menos que elas sejam declaradas privadas, como veremos mais adiante.

Além disso, qualquer unidade de compilação de um pacote pode usar definições de outros pacotes, desde que elas sejam visíveis. Assim, se em uma unidade de compilação do pacote segundo.pacote for preciso usar o tipo (classe ou interface, juntamente com todas operaçoes e atributos visíveis) Tipo definido no pacote primeiro.pacote temos que fazer as seguinte declarações:

package segundo.pacote;
...
import primeiro.pacote.Tipo;
...
o que permite que o nome Tipo seja usado como sinônimo para
primeiro.pacote.Tipo
dentro da unidade de compilação contendo as declarações acima. Dessa forma note que o pacote segundo.pacote não poderá ter a definição de um tipo com o nome Tipo.

Alternativamente, pode-se usar as declarações

package segundo.pacote;
...
import primeiro.pacote.*;
...
para importar todos os tipos públicos declarados no pacote primeiro.pacote.

É importante notar que importação de pacotes não é transitiva nem distribui sobre as unidades de compilação de um pacote. Por exemplo, considere a seguinte unidade de compilação

package terceiro.pacote;
...
import segundo.pacote.*;
...
Se nesta unidade for preciso utilizar o tipo Tipo definido no pacote primeiro.pacote, temos que adicionar a seguinte declaração
...
import primeiro.pacote.Tipo;
...
à unidade, mesmo que primeiro.pacote.Tipo tenha sido importado por segundo.pacote.

Além disso, se na unidade de compilação

package terceiro.pacote;
...
precisa-se usar alguma definição do pacote segundo.pacote temos que incluir a seguinte declaração
...
import segundo.pacote.*;
...
mesmo que esta declaração já tenha sido incluída em outra unidade de compilação do pacote terceiro.pacote.

Nomeando Pacotes e Unidades de Compilação

Cada unidade de compilação só pode definir um tipo público. De fato, para a implementação atual de Java, as unidades de compilação devem ser nomeadas de acordo com o seguinte padrão: NomedoTipoPúblico.java.

Para facilitar a identificação universal de pacotes que podem ser usados remotamente, estes devem ser nomeados usando-se o endereço Internet de onde o pacote está localizado. Por exemplo, BR.di.ufpe.segundo.pacote deveria ser usado ao invés de simplesmente segundo.pacote.


Paulo Borba (phmb@di.ufpe.br)