Pacotes

Computação II - Ciência da Computação


Prof.: Danilo S. Carvalho

Nessa aula, vamos entender como o funciona a organização do código em módulos no Java: os pacotes.


Ao final da aula, seremos capazes de organizar o nosso código de maneira profissional, como é feito nos pacotes oficiais da linguagem e bibliotecas de terceiros.

Conforme aprendemos anteriormente, os programas Java são escritos em unidades mínimas chamadas classes.


Cada classe é colocada em um arquivo próprio (.java), com o nome da classe.


Então como fazemos para usar uma classe que está em outro arquivo?

Para resolver esse problema, precisamos organizar nossas classes, de forma que o compilador possa encontrá-las.

Em Java, organizamos as classes como um sistema de arquivos, colocando-as em diretórios.

Por exemplo: podemos colocar nossa classe HelloWorld em um diretório chamado "minimo", que contém classes minimalistas.

Vamos também colocar nossa classe Divisores em um diretório chamado "numeros", que contém classes que operam com números.

E se criarmos uma classe Fatorial, também colocamos ela nesse diretório.

Esses diretórios que criamos são chamados de pacotes.

Eles representam a organização lógica das classes para o Java, e são utilizados para termos acesso às classes.

É também necessário declarar em cada arquivo a qual pacote ele pertence.

Por exemplo, o arquivo contendo a classe Divisores deve começar com a linha abaixo:

Seguido da definição da classe:

                        
                            package numeros;
                        
                    
                        
                            package numeros;

                            public class Divisores {
                                public static void imprimirDivisores(int numero) {
                                    for(int i=1; i <= numero; i++) {
                                        if(numero % i == 0) {
                                            System.out.println(i);
                                        }
                                    }
                                }

                                public static void main (String[] args) {
                                    imprimirDivisores(35);
                                }
                            }
                        
                    

Para acessarmos as classes, usamos a instrução import.

O import é também usado no início de um arquivo .java, e serve para declarar quais classes iremos acessar nesse arquivo, facilitando seu uso.

O Java vai procurar pela classe indicada no pacote correspondente para acessar o seu código.

Por exemplo, se queremos usar a classe Divisores em uma outra classe, importamos Divisores...

e então podemos usar a classe importada e seus métodos públicos dentro da nossa nova classe.

                        
                            import numeros.Divisores;
                        
                    
                        
                            import numeros.Divisores;

                            public class CalculaCoisas {
                                public static void main(String[] args) {
                                    Divisores.imprimirDivisores(102);  
                                }
                            }
                        
                    

Apesar de podermos escolher quase qualquer nome e estrutura de pacotes para um programa Java, há um padrão de nomenclatura para a criação de pacotes e classes.

O padrão universalmente aceito para nomear pacotes é chamado de "notação de nome reverso de domínio",

e leva em consideração o nome do domínio de Internet (real ou fictício) da organização onde o programa está sendo criado.

Nós por exemplo, somos do DCC/UFRJ, cujo nome de domínio é dcc.ufrj.br.

Nossas classes portanto devem estar dentro do pacote br.ufrj.dcc.

Mas como o DCC ainda engloba muita coisa, precisamos ser mais específicos.

Vamos usar o nome da disciplina.

Mas ainda há várias turmas de Comp 2... Então usamos o período.

Humm, mas há duas turmas de Comp 2... Colocamos então o nome do professor.

Agora temos um pacote só para essa turma.

Podemos agora organizar o resto dessa hierarquia conforme o tema das nossas classes.

Como as classes que mostrei até agora são exemplos, vou criar um pacote "exemplos".

Por fim, dentro desse pacote eu posso colocar o meu pacote de programas mínimos e os demais.

Para acessar a classe HelloWorld, fazemos então o seguinte import:

Como o acesso a uma classe é feito através do nome completo do pacote, esse padrão de nomenclatura garante que não tenhamos conflitos de classes com mesmo nome, vindas de organizações diferentes.

                        
                            package br.ufrj.dcc;  // mkdir -p br/ufrj/dcc
                        
                    
                        
                            package br.ufrj.dcc.comp2;
                        
                    
                        
                            package br.ufrj.dcc.comp2.ple;
                        
                    
                        
                            package br.ufrj.dcc.comp2.ple.aula_danilo;
                        
                    
                        
                            package br.ufrj.dcc.comp2.ple.aula_danilo.exemplos;
                        
                    
                        
                            package br.ufrj.dcc.comp2.ple.aula_danilo.exemplos.minimo;
                            // mkdir -p br/ufrj/dcc/comp2/ple/aula_danilo/exemplos/minimo
                        
                    
                        
                            import br.ufrj.dcc.comp2.ple.aula_danilo.exemplos.minimo.HelloWorld;

                        
                    

Para compilar o código, podemos usar o javac a partir do topo da hierarquia de diretórios.

Executamos o programa usando o nome completo da classe.

                        
                            javac br/ufrj/dcc/comp2/ple/aula_danilo/exemplos/minimo/HelloWorld.java
                        
                    
                        
                            java br.ufrj.dcc.comp2.ple.aula_danilo.exemplos.minimo.HelloWorld
                        
                    

A partir desse ponto, somos capazes de combinar várias classes simples para criar programas mais complexos.


Experimentem criar um pacote novo para a classe CalculaCoisas.


Olhem a documentação da linguagem Java, (Java API em particular) e vejam quantos pacotes estão à disposição do programador na JDK.

Perguntas:

  1. Que padrão é usado para nomear classes no Java? E os métodos e variáveis?
  2. Posso importar várias classes de uma vez com um único import?
  3. Posso acessar uma classe de outro pacote sem antes importá-la?

Até a próxima aula!