TIPOS PARAMETRIZADOS CLASSES GENÉRICAS PARTE I JAVA5 – Tiger ARQUITECTURAS DE SOFTWARE JAVA6 - Mustang © F. Mário Martins 2011 1 EVOLUÇÃO ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 2 EVOLUÇÃO JSE ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 3 JCF – COLECÇÕES DE JAVA JAVA COLLECTIONS FRAMEWORK (JCF 5.0): - Interfaces parametrizadas; - Classes parametrizadas (concretas ou não). ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 1 JCF – LIST<E> JAVA COLLECTIONS FRAMEWORK (JCF 5.0): - Interfaces parametrizadas; - Classes parametrizadas (concretas ou não). ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 4 TIPOS PARAMETRIZADOS CLASSES GENÉRICAS => TIPOS PARAMETRIZADOS E Stack ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 5 JAVA2 – JAVA5 Problema: Mudança de JAVA2 para JAVA5 Requisito: Tornar a linguagem “type safe” O impacto tecnológico será sempre brutal Caminho 1 Alterar a sintaxe da linguagem mas manter a máquina virtual (ou seja, manter bytebyte-code) JAVA5 ARQUITECTURAS DE SOFTWARE Caminho 2 Alterar a sintaxe da linguagem e mudar a máquina virtual ou o gerador de código intermédio C# (CIL) © F. Mário Martins 2011 7 PROBLEMAS COM JAVA2 Em JAVA2 tal como em JAVA5 a classe Object é a superclasse de todas as classes, simples ou colecções. Sendo classes TIPOS, o polimorfismo por inclusão garante que TODAS AS CLASSES (tipos) são compatíveis com Object (princípio da substituição de Liskov). Liskov). Assim, todos os arrays e todas as colecções (JCF) de JAVA2 são colecções cujos elementos são instâncias de Object ou de classes compatíveis (ou seja, qualquer coisa). ArrayList nomes = new ArrayList(); ArrayList idades = new ArrayList(); HashSet formas = new HashSet(); ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 8 JAVA2 NÃO É “TYPE SAFE” COMPILAÇÃO OK mas … ERROS DE RUNTIME ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 9 JAVA5 É “TYPE SAFE” ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 10 OUTRAS COISAS BOAS DE JAVA5 I/O: Classe Scanner; Importação estática; printf() “à la C”; Novo ciclo for(); Métodos varargs; Métodos com tipos de retorno co-variantes; Novo JCF: Colecções parametrizadas e iterador for(); Auto boxing e unboxing; Tipos enumerados “type safe”; Classes e métodos genéricos; ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 11 TIPO RESULTADO COCO-VARIANTE Permite redefinir de forma simples o método clone() de Object !! ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 12 JAVA5 “The new language features (in Java5) all have one thing in common: they take some common idiom and provide linguistic support for it. In other words, they shift the responsibility for writing the boilerplate code from the programmer to the compiler.” Joshua Bloch Senior staff engineer, Sun Microsystems ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 13 NÃONÃO-COVARIÂNCIA ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 14 NÃONÃO-COVARIÂNCIA A NÃONÃO-COVARIÂNCIA DAS COLECÇÕES É UMA PROPRIEDADE FUNDAMENTAL PARA A SUA SEGURANÇA DE TIPOS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 15 NÃONÃO-COVARIÂNCIA ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 16 HIERARQIA COM WILDCARDS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 17 WILDCARDS Todas as colecções usam wildcards nas suas APIS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 18 HIERARQUIA ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 19 HIERARQUIA COM WILDCARDS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 20 MODELO DE COMPILAÇÃO Nota: A MÁQUINA VIRTUAL DE JAVA NÃO FOI MODIFICADA. O BYTE CODE É O MESMO ! Cada instanciação de um tipo genérico ou método genérico tem uma representação própria; Porém, só existe uma representação para cada tipo genérico que é partilhada por todas as instanciações concretas; MantêmMantêm-se as colecções heterogéneas de JAVA2, cf. ArrayList, etc., que passam a designardesignar-se por RAW TYPES; TYPES; TYPE ERASURE (ELISÃO DE TIPOS) => As classes genéricas têm por tipo os equivalentes raw types. Assim, por exemplo, ArrayList<String> e ArrayList<Ponto> são do tipo ArrayList, ArrayList, etc. O resto baseiabaseia-se em Object e casting. casting. ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 21 TYPE ERASURE - EXEMPLO ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 22 TYPE ERASURE - EXEMPLO ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 23 TYPE ERASURE - PARÂMETROS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 24 CRIAÇÃO DE CLASSES GENÉRICAS Implica dominar o mecanismo de “type erasure” de JAVA5 que traz muitas complicações e “warnings” por vezes complexos; Implica conhecer o mecanismo de inferência de tipos; Implica conhecer o mecanismo de “wilcard capture”; Implica conhecer os mecanismo de reflexão de JAVA5; Implica conhecer bem a classe Classe<T>. VAMOS CRIAR DUAS CLASSES GENÈRICAS E VER, PASSO A PASSO, COMO TAL PODE SER FEITO ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 25 CRIAÇÃO DE CLASSES GENÉRICAS Classe genérica Cofre<E> capaz de guardar qualquer coisa de um tipo E. ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 26 CRIAÇÃO DE CLASSES GENÉRICAS Cofre<Integer> intgCofre = new Cofre<Integer>(); intgCofre.guarda(new Integer(12)); Cofre<Integer> intCofre = new Cofre<Integer>(12); // boxing Cofre<String> strCofre = new Cofre<String>("abc"); ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 27 CRIAÇÃO DE CLASSES GENÉRICAS A compilação da classe genérica Cofre<E> cria automaticamente o tipo raw que lhe corresponde, ou seja, Cofre. strCofre.getClass().getName() ======> “Cofre” intCofre.getClass().getName() ======> “Cofre” ERRO !! intCofre instanceOf Cofre<Integer> ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 28 CRIAÇÃO DE CLASSES GENÉRICAS Utilizações gerais ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 29 CRIAÇÃO DE CLASSES GENÉRICAS Utilizações gerais ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 30 CRIAÇÃO DE CLASSES GENÉRICAS Restrições e regras gerais ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 31 CRIAÇÃO DE CLASSES GENÉRICAS ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 32 CRIAÇÃO DE CLASSES GENÉRICAS EXERCÍCIO: Tentar Criar a classe genérica PAR<X, Y> ARQUITECTURAS DE SOFTWARE © F. Mário Martins 2011 33