tipos parametrizados classes genéricas

Propaganda
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
Download