Pacotes – Organizando suas classes e bibliotecas Material baseado na apostila FJ-11: Java e Orientação a Objetos do curso Caelum, Ensino e Inovação, disponível para download em http://www.caelum.com.br/apostilas/ 1 O que são pacotes? • Um pacote é um agrupamento de tipos relacionados fornecendo proteção de acesso e gerência de “espaço de nomes” – Tipos aqui são usados para referir-se a classes e interfaces. – A implementação física de um pacote está freqüentemente associada a uma pasta ou diretório do sistema de arquivos. 2 Benefícios do Empacotamento • Você e outros programadores podem facilmente determinar que as classes e interfaces do pacote são relacionadas. • Você e outros programadores sabem onde procurar classes e interfaces que possam fornecer, por exemplo, funções relacionadas a gráficos, bancos de dados, persistência, etc. • Os nomes de suas classes e interfaces não irão conflitar com os nomes em outros pacotes porque o pacote cria um novo espaço de nomes. • Você pode permitir que as classes dentro de um mesmo pacote tenham acesso irrestrito umas as outras ao mesmo tempo em que restringe o acesso para as classes fora do pacote 3 Organização em pacotes • As próprias classes do JRE estão também organizadas em pacotes 4 Criando um pacote • Para criar um pacote, você escolhe um nome para o pacote e põe um comando package com o nome escolhido na primeira linha de cada arquivo fonte que contém os tipos (classes e interfaces) que você quer incluir no pacote. • Se você não usa um comando package, seu tipo resulta em um pacote sem nome. – Use um pacote sem nome somente para aplicações pequenas ou temporárias 5 Colocando uma classe em um pacote • Para colocar uma classe em um pacote, são necessários dois passos: 1. incluir a declaração package na primeira linha do código fonte package br.ufrj.nce.siga; class Aluno { ... } 6 Colocando uma classe em um pacote 2. colocar os bytecodes gerados pelo processo de compilação em uma pasta que segue a estrutura da declaração package. ??? br ufrj nce siga Aluno.class 7 Padrão da nomenclatura de pacotes • O padrão recomendado pela Sun para nomes de pacotes é o domínio da empresa, do mais genérico para o mais específico. package br.ufrj.nce.siga; package br.ufrj.dcc.gris; • Esse padrão evita ao máximo o conflito de nomes entre pacotes de diferentes empresas. • Nomes de pacotes devem conter apenas letras minúsculas. 8 Importando e usando classes de outros pacotes 9 Usando classes do mesmo pacote • Para usar uma classe do mesmo pacote, basta fazer referência a ela. 10 Usando classes de outros pacotes • Para usar uma elemento público (classes e interfaces) de fora do pacote, você deve escolher uma das seguintes opções: – Importar o elemento do pacote usando o comando import – Importar todos os elementos do pacote usando o comando import – Referenciar o elemento pelo seu nome qualificado completo (sem usar o import) 11 Importando Pacotes • A fim de poder usar classes fora do pacote onde você está trabalhando, você tem de importar o pacote dessas classes. • Por default, todos os programas Java importam o pacote java.lang.*. Por esse motivo, você pode usar classes como String e Integer em seus programas ainda que você não tenha importado nenhum pacote. • A sintaxe para importar um pacote é: import <nomedoPacote>; 12 Exemplo: importando uma Classe ou um Pacote • Nesse último exemplo, todas as classes do pacote são importadas, mas não os subpacotes. Assim, para importar as classes dos pacotes javax.swing e javax.swing.event, é preciso fazer: 13 Importação de classes • Importar todas as classes de um pacote não implica em perda de performance em tempo de execução, mas pode trazer problemas com classes de mesmo nome! • Além disso, a importação explícita de classes é considerada boa prática de programação, pois facilita a leitura do código por outros programadores. 14 Usando classes de outros pacotes através do nome qualificado 15 Acesso aos atributos, construtores e métodos Onde: C1 classes filhas no mesmo pacote + ~ # + ~ # + C2 classes filhas em outro pacote C3 classes acessando através de referências (no mesmo pacote) + ~ # + # As marcações em vermelho mostram a visibilidade dos atributos e métodos da classe Qualquer para as outras classes do projeto, em função do modificador utilizado. C4 classes acessando através de referências (fora do pacote) 16 Classes públicas • Para que uma classe possa ser importada por outra classe fora do pacote, ela tem de ser declarada com o modificador public • Um arquivo pode conter uma única classe pública, e esta determina o nome do arquivo (no exemplo anterior, o arquivo que contém a classe Funcionario tem de ter o nome Funcionario.java) 17 Classpath • Vamos voltar ao exemplo da classe Aluno no slide 7. Já vimos que o arquivo Alunos.class, contendo os bytecodes gerados pelo processo de compilação devem estar em uma pasta que reproduza a declaração package do arquivo Alunos.java • Mas onde devo colocar esta estrutura de arquivos? ???/br/ufrj/nce/siga/Aluno.class ??? br ufrj nce siga Aluno.class 18 Classpath • ???/br/ufrj/nce/siga/Aluno.class • Você pode colocar sua estrutura de pastas onde quiser, mas sua escolha tem de ser informada ao compilador Java através da variável de ambiente CLASSPATH • Suponha que você decida montar a estrutura de pastas na raiz do driver C. Seria necessário então fazer: C:\> set classpath=c:\ • Para sistemas Unix, supondo que nossos arquivos *.class estão no diretório /usr/local/minhasClasses, escreveríamos: export classpath=/usr/local/minhasClasses 19 Classpath • Você pode ainda incluir mais de um caminho na variável de ambiente CLASSPATH, basta separá-los por ; (windows) ou : (Unix). Exemplo: set classpath=C:\;D:\;E:\MeusProgramas\Java • para sistemas Unix: export classpath=/usr/local/java:/usr/minhasClasses 20 Trabalhando com pacotes no NetBeans • Trabalhar com pacotes no NetBeans é muito fácil! Quando criamos uma nova classe, o NetBeans, automaticamente, cria a estrutura de diretórios correspondente à declaração package 21 Trabalhando com pacotes no NetBeans • A pasta chamada classes é automaticamente incluída na CLASSPATH 22 Trabalhando com pacotes no NetBeans • Você pode mudar uma classe de pacote simplesmente arrastando o arquivo correspondente com o mouse • O NetBeans exibe uma tela de confirmação e, em seguida, muda a declaração package do arquivo para corresponder ao caminho da 23 nova pasta.