Capítulo 17 Recursos Especiais do Java Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Objetivos do Capítulo Indicar como documentar classes e interfaces e como gerar esta documentação utilizando o javadoc. Apresentar alguns mecanismos complementares relacionados com a programação orientada a objetos. Explorar os principais recursos que passaram a ser suportados a partir da plataforma Java 5. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Visão Geral Documentação Comentários JavaDoc Orientação a objetos Classes internas Arquivos com múltiplas classes Objetos anônimos Recursos do Java 5 Importação estática ForEach Autoboxing VarArgs Enum Genéricos Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Documentação Comentários de documentação Descrevem componentes e seus membros Sintaxe especial Interpretados pelo JavaDoc Sintaxe: /** <texto> <tags> */ Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Documentação Tags @author: nota sobre o autor. @param: descrição de parâmetros. @return: descrição do retorno de métodos. @see: link para classes e métodos relacionados. @throws: exceções disparadas por um método. @exception: igual à tag @throws. @deprecated: indica elemento depreciado. @link: inclusão manual de link HTML. @since: indica versão do JDK em que o recurso foi introduzido. @version: versão do componente ou método. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.2 – CalculoArea.java Classe documentada Tarefa: gerar a documentação No Linux: javadoc –d /home/rui/PCJ/Cap17/Docs –author –charset UTF-8 Documentacao.java No Windows: javadoc –d C:\PCJ\Cap17\Docs –author –charset ISO-8859-1 Documentacao.java Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Classes Internas Criadas dentro de outra classe Características Encapsuladas como os membros da classe externa. Invisíveis a todas as outras classes. Acessam diretamente os membros públicos e protegidos da classe externa. Não podem conter atributos e métodos estáticos. Possuem a referência this. Acessam a referência this da classe externa: NomeDaClasseExterna.this Resultado da compilação <NomeDaClasseExterna>$<NomeDaClasseInterna>.class Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.2 – CalculoArea.java Classe Circulo Construtor: inicializar atributo getArea(): PI * raio2 Classe CalculoArea calcular( ): solicitar o raio de um círculo, gravá-la em uma instância da classe Circulo, calcular sua área e exibir o resultado. main( ): instanciar a classe CalculoArea e invocar seu método calcular( ). Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Arquivos com Múltiplas Classes Número ilimitado de classes Todas acessíveis às demais classes do mesmo pacote Só uma classe pública Resultado da compilação Um arquivo por classe: <NomeDaClasse>.class Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.3 – CalculoCirculo.java Classe Circulo Construtor: inicializar atributo getArea(): PI * raio2 Classe CalculoArea calcular( ): solicitar o raio de um círculo, gravá-la em uma instância da classe Circulo, calcular sua área e exibir o resultado. main( ): instanciar a classe CalculoArea e invocar seu método calcular( ). Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Objetos Anônimos Objetos desprovidos de referências Sintaxe new <construtor>(<argumentos>) Algumas aplicações: Argumento na invocação de métodos Encapsulamento de dados para gravação em vetor Invocação de um único método Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.4 – Fila.java Atributos: ficha, nome. Construtor: captar dados e inicializar atributos. exibirDados( ): produzir mensagem com valores de atributos. main( ): criar dois objetos anônimos e exibir dados. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Importação Estática A partir do Java 5 – JSE 1.5 (2005) Objetivo: facilitar o uso de membros estáticos Atributos Métodos Sintaxe: import static <caminho>.<componente>.<membro>; import static <caminho>.<componente>.*; Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.5 – ImportacaoEstatica.java Importações estáticas: Todos os membros da classe Math. Métodos utilizados da classe javax.swing.JOptionPane. Método main( ) Solicitar um número decimal. Calcular seu seno e seu cosseno. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra ForEach A partir do Java 5 – JSE 1.5 (2005) Objetivo: facilitar o percurso por um vetor ou coleção Dispensa o contador Sintaxe: for (<tipo> <nome> : <vetor/coleção>) { } Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.6 – CadastroAmigos.java Classe Amigo Atributos nome e fone. Construtor: captar dados e inicializar atributos. toString( ): <nome> - <fone> Classe CadastroAmigos: método main( ) Vetor com capacidade para 20 amigos Laço for: permitir o registro de até 20 amigos. Laço ForEach: recuperar a lista de amigos cadastrados. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Autoboxing A partir do Java 5 – JSE 1.5 (2005) Objetivo: automatizar encapsulamento de tipos primitivos Classes empacotadoras ou classes-invólucro boolean: java.lang.Boolean char: java.lang.Character byte: java.lang.Byte short: java.lang.Short int: java.lang.Integer long: java.lang.Long float: java.lang.Float double: java.lang.Double Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Autoboxing Procedimento anterior: int numero = 1500; Integer objeto = new Integer( numero ); Procedimento atual: int numero = 1500; Integer objeto = numero; Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Autoboxing Procedimento anterior: Integer objeto = new Integer( 1500 ); int numero = objeto.intValue(); Procedimento atual: Integer objeto = 1500; int numero = objeto; Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra VarArgs A partir do Java 5 – JSE 1.5 (2005) Objetivo: permitir a invocação de métodos com número variável de argumentos. Sintaxe: [encapsulamento] <retorno> <nome>(<tipo>... <nome>) { } Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.7 – Varargs.java calcularMedia( ) Método estático Parâmetro notas: número variável de valores ForEach para somar as notas Método main( ) Solicitar três notas Calcular a média das duas primeiras Calcular a média das três Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Enumerações A partir do Java 5 – JSE 1.5 (2005) É um novo tipo. São manipulados via referências. Declaração: Como atributos de classes Em arquivo distinto Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Enumerações É um conjunto de constantes. Todas estáticas Podem especificar argumentos (valores para o construtor) Membros suportados: Atributos Construtores Métodos Instanciação: Uma instância sempre será uma de suas constantes. Procedimento: atribuir uma constante a uma referência. Construtores públicos não são permitidos. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Enumerações Sintaxe Geral: [encapsulamento] enum <nome> { <constantes>; [atributos] [construtores] [métodos] } As constantes devem ser separadas por vírgulas. Se houver argumentos, especificá-los entre parênteses. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.8 – SorteioCaractere.java Enumeração TipoCaractere Atributo da classe Constantes: NUMERO, LETRA_MAIUSCULA, LETRA_MINUSCULA, OUTRO Método main( ) Sortear um número: de 0 a 150 Converter em caractere Criar referência para a enumeração: TipoCaractere tipo Atribuir-lhe uma das constantes com base no caractere sorteado Utilizar estrutura switch para mapear a referência para um texto descritivo: “Número”, “Letra maiúscula” (65-90), “Letra minúscula” (97-122) ou “Caractere especial”. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.9 – Meses.java Código 17.10 – Revista.java Código 17.11 – CadastroRevistas.java Permitir o cadastro de até 20 revistas Listar as revistas cadastradas Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Métodos Genéricos A partir do Java 5 – JSE 1.5 (2005) Métodos que podem ser invocados com argumentos de diferentes tipos. Parâmetros de tipo: Declarados em uma seção própria Entre colchetes angulares Antes do retorno Letras maiúsculas (convenção) Podem ser utilizados como: Tipo de retorno do método Tipo dos parâmetros do método Tipo de variáveis locais Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Métodos Genéricos Exemplo: public <X,Y> int contarCaracteres(X obj1, Y obj2) { return obj1.toString().length() + obj2.toString().length(); } int i = 0; i = contarCaracteres("Java",12); System.out.println(i); i = contarCaracteres(5.67,"JSE"); System.out.println(i); i = contarCaracteres(5.67,1500); System.out.println(i); i = contarCaracteres("Java","JSE 5"); System.out.println(i); i = contarCaracteres("Java",Meses.AGOSTO); System.out.println(i); Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.12 – MetodoGenerico.java exibirObjeto( ) Método estático e genérico: parâmetro de tipo “O” Produzir uma mensagem com o nome da classe e a representação textual de um objeto especificado. main( ) Invocar o método exibirObjeto( ) com argumentos de diferentes tipos: Integer, Double, Character e String Sortear os três primeiros argumentos Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Código 17.13 – MenorNumero.java localizarMenor( ) Método estático e genérico: parâmetro de tipo “L” que deve ser uma instância de Number Receber um vetor de números de qualquer tipo e retornar o menor. main( ) Invocar o método locallizarMenor( ) sobre vetores de números inteiros e de números decimais e exibir o retorno produzido Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Classes Genéricas A partir do Java 5 – JSE 1.5 (2005) São classes parametrizadas. Contém uma seção de parâmetros de tipo após seu nome Na sua instanciação, especificar um valor para cada parâmetro de tipo (valor omitido = Object assumido) Objetivos: Reduzir a redundância de código. Desenvolver componentes reutilizáveis. Ter segurança de tipo em tempo de compilação. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Estudo de Caso Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 1 Insira comentários de documentação em todas as classes que foram escritas para compor o último exemplo apresentado. Esse exemplo tratou do uso de classes genéricas e o foi composto pelas classes VetorObjetos, ListaCompras, Produto e ListaProdutos. Insira comentários de documentação para todos os atributos, construtores e métodos dessas classes. Depois disso, utilize o javadoc para gerar os arquivos HTML que comporão a documentação completa deste exemplo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 2 Altere o arquivo CadastroAmigos.java de modo que a classe Amigo passe a ser uma classe interna da classe CadastroAmigos. Além disso, declare o vetor que abrigará as instâncias da classe Amigo como um atributo da classe CadastroAmigos e transfira todas as instruções que realiza o cadastro dos amigos para um método chamado realizarCadastros( ). Inclua apenas uma instrução em seu método main( ), que crie uma instância anônima da classe CadastroAmigos e que invoque o método realizarCadastros( ) da mesma. A figura do slide seguinte apresenta como deverá ficar a estrutura das classes Amigo e CadastroAmigos após você ter realizado todos estes ajustes. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 2 Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 3 Crie um aplicativo, chamado CalculoRaiz, que permita a realização do cálculo da raiz quadrada de qualquer número informado. Este aplicativo deve solicitar o número através de um diálogo de entrada e deve exibir o resultado através de outro diálogo. A figura do slide seguinte ilustra como devem ser apresentados estes dois diálogos. Este aplicativo deve permitir que seja realizado uma quantidade indefinida de cálculos e só deve ser encerrado quando o primeiro destes diálogos for cancelado. Faça a importação estática do método showInputDialog( ) e do método showMessageDialog( ) da classe javax.swing.JOptionPane e os utilize para produzir os dois diálogos supracitados. Também faça a importação estática do método sqrt( ) da classe Math e o utilize para realizar o cálculo da raiz quadrada. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 3 Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 4 Crie um aplicativo, chamado GeradorNumeros, que crie um vetor capaz de armazenar números inteiros e que grave um número em cada posição deste vetor. A definição do tamanho deste vetor deve ser sorteada pelo aplicativo e deve variar de 5 a 10 posições. O número a ser gravado em cada posição deste vetor também deve ser sorteado pelo aplicativo e não deve ser inferior a 1000 ou superior a 1500. Ao final, utilize um laço ForEach para percorrer este vetor e recuperar todos os números que foram armazenados nele. Depois, exiba estes números através de uma mensagem como aquela que é apresentada na figura abaixo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 5 Crie uma nova classe, chamada RegistroNotas, de acordo com a representação gráfica do slide seguinte. O método avaliar( ) desta classe deve calcular a média de um conjunto de notas e definir se o aluno está aprovado ou reprovado. Se ele estiver aprovado, o retorno produzido deve ser true. Se ele estiver reprovado, o retorno produzido deve ser false. O parâmetro chamado minimo indica a média mínima que deve ser obtida para a aprovação. O parâmetro chamado notas representa o conjunto de notas obtidas pelo aluno. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 5 O método main( ) dessa classe deve realizar a interação do aplicativo com o usuário. Primeiro, ele deve solicitar a média mínima que deve ser obtida pelos alunos para que sejam aprovados. Em seguida, deve solicitar quantas avaliações foram realizadas no período letivo em questão. Depois, deve solicitar a nota obtida pelo aluno em cada uma das avaliações. Ao final, deve exibir uma mensagem indicando se o aluno está aprovado ou reprovado. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 6 Crie uma nova enumeração, chamada EstadoCivil, de acordo com a representação gráfica apresentada na figura abaixo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 7 Crie uma nova classe genérica, chamada VetorNumeros, de acordo com a representação gráfica do slide seguinte. O parâmetro de tipo desta classe, chamado E, só deve aceitar instâncias da classe java.lang.Number. O atributo chamado numeros será um vetor do tipo especificado pelo parâmetro de tipo e abrigará um conjunto de números. Utilize o atributo quantidade para controlar a quantidade de números gravados neste vetor. O parâmetro do construtor será utilizado para definir o tamanho deste vetor e, por conseguinte, a quantidade máxima de números que ele poderá receber. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Exercício 7 O método incluirNumero( ) deve receber um número qualquer e gravá-lo no vetor. O método calcularMedia( ) deve somar todos os números que encontram-se neste vetor e retornar a sua média. O método encontrarMenor( ) deve percorrer o vetor e retornar o menor valor encontrado. O método encontrarMaior( ), por outro lado, deve percorrer este vetor e retornar o maior número encontrado. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra Contato Com o autor: Rui Rossi dos Santos E-mail: [email protected] Web Site: http://www.ruirossi.pro.br Com a editora: Editora NovaTerra Telefone: (21) 2218-5314 Web Site: http://www.editoranovaterra.com.br Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra