Buscar

Linguagens de Programação - Programação Orientada a Objetos: Java Generics

Prévia do material em texto

Programac¸a˜o Orientada a Objetos
Java Generics
Rodrigo Bonifa´cio
4 de outubro de 2012
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Implementac¸a˜o de uma Pilha (simples)
package br . unb . c i c . adt ;
pub l i c c l a s s Pi lhaComoArray implements P i l h a A b s t r a t a {
pr i va te s t a t i c f i n a l i n t MAX SIZE = 1 0 ;
pr i va te i n t p i l h a [ ] ;
pr i va te i n t topo ;
pub l i c Pi lhaComoArray ( ) { . . . }
pub l i c void e m p i l h a ( i n t v a l o r ) { . . . }
pub l i c i n t remove ( ) { . . . }
pub l i c boolean p i l h a C h e i a ( ) { . . . }
pub l i c boolean p i l h a V a z i a ( ) { . . . }
}
Pouco reusa´vel (tamanho e tipo de elementos fixos)
Sem a definic¸a˜o de contratos para lidar com situac¸o˜es de erros
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Implementac¸a˜o de uma Pilha (simples)
package br . unb . c i c . adt ;
pub l i c c l a s s Pi lhaComoArray implements P i l h a A b s t r a t a {
pr i va te s t a t i c f i n a l i n t MAX SIZE = 1 0 ;
pr i va te i n t p i l h a [ ] ;
pr i va te i n t topo ;
pub l i c Pi lhaComoArray ( ) { . . . }
pub l i c void e m p i l h a ( i n t v a l o r ) { . . . }
pub l i c i n t remove ( ) { . . . }
pub l i c boolean p i l h a C h e i a ( ) { . . . }
pub l i c boolean p i l h a V a z i a ( ) { . . . }
}
Pouco reusa´vel (tamanho e tipo de elementos fixos)
Sem a definic¸a˜o de contratos para lidar com situac¸o˜es de erros
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
. . . estabelecendo contratos de excec¸o˜es
package br . unb . c i c . adt ;
pub l i c i n t e r f a ce P i l h a A b s t r a t a {
pub l i c void e m p i l h a ( i n t v a l o r ) throws E x c e c a o P i l h a ;
pub l i c i n t remove ( ) throws E x c e c a o P i l h a ;
pub l i c boolean p i l h a C h e i a ( ) ;
pub l i c boolean p i l h a V a z i a ( ) ;
}
Ainda com a limitac¸a˜o de pouco reuso
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
. . . estabelecendo contratos de excec¸o˜es
package br . unb . c i c . adt ;
pub l i c i n t e r f a ce P i l h a A b s t r a t a {
pub l i c void e m p i l h a ( i n t v a l o r ) throws E x c e c a o P i l h a ;
pub l i c i n t remove ( ) throws E x c e c a o P i l h a ;
pub l i c boolean p i l h a C h e i a ( ) ;
pub l i c boolean p i l h a V a z i a ( ) ;
}
Ainda com a limitac¸a˜o de pouco reuso
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha mais
reusa´vel, em relac¸a˜o ao tipo
dos elementos?
Queremos diferentes tipos de pilhas
Pilhas de figuras geome´tricas
Pilhas contendo ambientes de execuc¸a˜o de um programa
Pilhas de qualquer coisa que tenhamos interesse
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha mais
reusa´vel, em relac¸a˜o ao tipo
dos elementos?
Queremos diferentes tipos de pilhas
Pilhas de figuras geome´tricas
Pilhas contendo ambientes de execuc¸a˜o de um programa
Pilhas de qualquer coisa que tenhamos interesse
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Nas linguagens imperativas, treˆs soluc¸o˜es bem difundidas
Linguagem C:
Copiar e colar o co´digo fonte da pilha e fazer as alterac¸o˜es manualmente.
Na verdade, a pilha poderia conter um apontador para void *, mas isso
requer converso˜es de tipo espalhadas pelo programa.
Linguagens Smalltalk e (Java < 1.5):
Uso de heranc¸a, fazendo com que containers como pilhas mantenham
refereˆncias para uma classe ancestral na hierarquia (possivelmente,
Object). Novamente, isso requer uma se´ria de converso˜es de tipos
espalhadas pelo programa. Ale´m disso, como C++ suporta heranc¸a
mu´ltipla, na˜o pode existir a restric¸a˜o de que todas as classes possuem um
ancestral comum.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Nas linguagens imperativas, treˆs soluc¸o˜es bem difundidas
Linguagem C:
Copiar e colar o co´digo fonte da pilha e fazer as alterac¸o˜es manualmente.
Na verdade, a pilha poderia conter um apontador para void *, mas isso
requer converso˜es de tipo espalhadas pelo programa.
Linguagens Smalltalk e (Java < 1.5):
Uso de heranc¸a, fazendo com que containers como pilhas mantenham
refereˆncias para uma classe ancestral na hierarquia (possivelmente,
Object). Novamente, isso requer uma se´ria de converso˜es de tipos
espalhadas pelo programa. Ale´m disso, como C++ suporta heranc¸a
mu´ltipla, na˜o pode existir a restric¸a˜o de que todas as classes possuem um
ancestral comum.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Nas linguagens imperativas, treˆs soluc¸o˜es bem difundidas
Linguagem C:
Copiar e colar o co´digo fonte da pilha e fazer as alterac¸o˜es manualmente.
Na verdade, a pilha poderia conter um apontador para void *, mas isso
requer converso˜es de tipo espalhadas pelo programa.
Linguagens Smalltalk e (Java < 1.5):
Uso de heranc¸a, fazendo com que containers como pilhas mantenham
refereˆncias para uma classe ancestral na hierarquia (possivelmente,
Object).
Novamente, isso requer uma se´ria de converso˜es de tipos
espalhadas pelo programa. Ale´m disso, como C++ suporta heranc¸a
mu´ltipla, na˜o pode existir a restric¸a˜o de que todas as classes possuem um
ancestral comum.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Nas linguagens imperativas, treˆs soluc¸o˜es bem difundidas
Linguagem C:
Copiar e colar o co´digo fonte da pilha e fazer as alterac¸o˜es manualmente.
Na verdade, a pilha poderia conter um apontador para void *, mas isso
requer converso˜es de tipo espalhadas pelo programa.
Linguagens Smalltalk e (Java < 1.5):
Uso de heranc¸a, fazendo com que containers como pilhas mantenham
refereˆncias para uma classe ancestral na hierarquia (possivelmente,
Object). Novamente, isso requer uma se´ria de converso˜es de tipos
espalhadas pelo programa.
Ale´m disso, como C++ suporta heranc¸a
mu´ltipla, na˜o pode existir a restric¸a˜o de que todas as classes possuem um
ancestral comum.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Nas linguagens imperativas, treˆs soluc¸o˜es bem difundidas
Linguagem C:
Copiar e colar o co´digo fonte da pilha e fazer as alterac¸o˜es manualmente.
Na verdade, a pilha poderia conter um apontador para void *, mas isso
requer converso˜es de tipo espalhadas pelo programa.
Linguagens Smalltalk e (Java < 1.5):
Uso de heranc¸a, fazendo com que containers como pilhas mantenham
refereˆncias para uma classe ancestral na hierarquia (possivelmente,
Object). Novamente, isso requer uma se´ria de converso˜es de tipos
espalhadas pelo programa. Ale´m disso, como C++ suporta heranc¸a
mu´ltipla, na˜o pode existir a restric¸a˜o de que todas as classes possuem um
ancestral comum.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Java Generics
Containers (como pilhas) sa˜o declarados em termos de tipos
parametrizados, que sa˜o substituidos pelo compilador quando
referenciamos uma instaˆncia de um template:
pilha de inteiros
pilha de figuras geome´tricas
pilha de ambientes de execuc¸a˜o de um programa, . . .
Em vez de reusar propriedades e me´todos de objetos, o
mecanismo de Generics em Java reusa co´digo fonte
Mecanismo de type erasure implementado pelo compilador.
Na˜o da´ para entrar em detalhes de como esse mecanismo e´
implementado na aula de hoje.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Java Generics
Containers (como pilhas) sa˜o declarados em termos de tipos
parametrizados, que sa˜o substituidos pelo compilador quando
referenciamos uma instaˆncia de um template:
pilha de inteiros
pilha de figuras geome´tricaspilha de ambientes de execuc¸a˜o de um programa, . . .
Em vez de reusar propriedades e me´todos de objetos, o
mecanismo de Generics em Java reusa co´digo fonte
Mecanismo de type erasure implementado pelo compilador.
Na˜o da´ para entrar em detalhes de como esse mecanismo e´
implementado na aula de hoje.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Java Generics
Containers (como pilhas) sa˜o declarados em termos de tipos
parametrizados, que sa˜o substituidos pelo compilador quando
referenciamos uma instaˆncia de um template:
pilha de inteiros
pilha de figuras geome´tricas
pilha de ambientes de execuc¸a˜o de um programa, . . .
Em vez de reusar propriedades e me´todos de objetos, o
mecanismo de Generics em Java reusa co´digo fonte
Mecanismo de type erasure implementado pelo compilador.
Na˜o da´ para entrar em detalhes de como esse mecanismo e´
implementado na aula de hoje.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Java Generics
Containers (como pilhas) sa˜o declarados em termos de tipos
parametrizados, que sa˜o substituidos pelo compilador quando
referenciamos uma instaˆncia de um template:
pilha de inteiros
pilha de figuras geome´tricas
pilha de ambientes de execuc¸a˜o de um programa, . . .
Em vez de reusar propriedades e me´todos de objetos, o
mecanismo de Generics em Java reusa co´digo fonte
Mecanismo de type erasure implementado pelo compilador.
Na˜o da´ para entrar em detalhes de como esse mecanismo e´
implementado na aula de hoje.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Sintaxe para definic¸a˜o de generics
Diferentemente de C++, na˜o se faz necessa´ria o uso de uma
palavra reservada para declara um tipo como sendo parametrizado.
Apenas indicamos que o tipo e´ parametrizado em relac¸a˜o a um ou
mais tipos.
package br . unb . c i c . adt ;
pub l i c i n t e r f a ce P i l h a G e n e r i c a<T> {
pub l i c void e m p i l h a (T v a l o r ) ;
pub l i c T remove ( ) ;
pub l i c boolean p i l h a C h e i a ( ) ;
pub l i c boolean p i l h a V a z i a ( ) ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Sintaxe para definic¸a˜o de generics
Diferentemente de C++, na˜o se faz necessa´ria o uso de uma
palavra reservada para declara um tipo como sendo parametrizado.
Apenas indicamos que o tipo e´ parametrizado em relac¸a˜o a um ou
mais tipos.
package br . unb . c i c . adt ;
pub l i c i n t e r f a ce P i l h a G e n e r i c a<T> {
pub l i c void e m p i l h a (T v a l o r ) ;
pub l i c T remove ( ) ;
pub l i c boolean p i l h a C h e i a ( ) ;
pub l i c boolean p i l h a V a z i a ( ) ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Implementac¸a˜o (1/2)
package br . unb . c i c . adt ;
import j a v a . u t i l . A r r a y L i s t ;
import j a v a . u t i l . L i s t ;
pub l i c c l a s s Pi lhaGener i caComoArray<T> implements P i l h a G e n e r i c a<T> {
p r i v a t e s t a t i c f i n a l i n t MAX SIZE = 1 0 ;
p r i v a t e i n t topo ;
p r i v a t e L i s t<T> p i l h a ;
pub l i c P i l h a G e n e r i c a C o m o A r r a y ( ) {
topo = 0 ;
p i l h a = new A r r a y L i s t<T>(MAX SIZE ) ;
}
pub l i c vo id e m p i l h a (T v a l o r ) {
p i l h a . add ( topo++, v a l o r ) ;
}
. . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Implementac¸a˜o (2/2)
pub l i c T remove ( ) {
r e t u r n p i l h a . g e t(−−topo ) ;
}
pub l i c boolean p i l h a C h e i a ( ) {
r e t u r n topo >= MAX SIZE ;
}
pub l i c boolean p i l h a V a z i a ( ) {
r e t u r n topo == 0 ;
}
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Instanciac¸a˜o de um template
pub l i c s t a t i c void main ( S t r i n g a r g s ) {
Pi lhaGener i caComoArray<int> s t a c k ;
f o r ( i n t i = 0 ; i < 5 ; i ++) {
s t a c k . e m p i l h a ( f i b o n a c c i ( i ) ) ;
}
f o r ( i n t k = 0 ; k < 5 ; k++) {
System . out . p r i n t l n ( s t a c k . remove ( ) ) ;
}
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Constantes em templates C++
A parametrizac¸a˜o de uma classe na˜o e´ restrita aos tipos que ela
manipula. Valores tambe´m podem ser parametrizados em relac¸a˜o a
uma definic¸a˜o de classe (isso e´ va´lido apenas em C++).
template<c l a s s T, i n t msize = 100>
c l a s s Stack {
pr i va te :
i n t top ;
T s t a c k [ ms ize ] ;
pub l i c :
Stack ( ) ;
T pop ( ) throw ( S t a c k E x c e p t i o n ) ;
void push (T v a l u e ) throw ( S t a c k E x c e p t i o n ) ;
b o o l i s F u l l ( ) throw ( ) ;
b o o l i sEmpty ( ) throw ( ) ;
} ;
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Constantes em templates C++
A parametrizac¸a˜o de uma classe na˜o e´ restrita aos tipos que ela
manipula. Valores tambe´m podem ser parametrizados em relac¸a˜o a
uma definic¸a˜o de classe (isso e´ va´lido apenas em C++).
template<c l a s s T, i n t msize = 100>
c l a s s Stack {
pr i va te :
i n t top ;
T s t a c k [ ms ize ] ;
pub l i c :
Stack ( ) ;
T pop ( ) throw ( S t a c k E x c e p t i o n ) ;
void push (T v a l u e ) throw ( S t a c k E x c e p t i o n ) ;
b o o l i s F u l l ( ) throw ( ) ;
b o o l i sEmpty ( ) throw ( ) ;
} ;
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Neste ponto, precisar´ıamos revisitar a implementac¸a˜o do me´todo
bool isFull()
t e m p l a t e <c l a s s T>
b o o l Stack<T> : : i s F u l l ( ) throw ( ) {
return th i s−>top >= msize ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha ainda mais
flex´ıvel, sem limite de
tamanho?
Simples, usando alocac¸a˜o dinaˆmica na˜o declaramos um array
contendo msize ou MAX SIZE elementos.
Tarefa para voceˆs . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha ainda mais
flex´ıvel, sem limite de
tamanho?
Simples, usando alocac¸a˜o dinaˆmica
na˜o declaramos um array
contendo msize ou MAX SIZE elementos.
Tarefa para voceˆs . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha ainda mais
flex´ıvel, sem limite de
tamanho?
Simples, usando alocac¸a˜o dinaˆmica na˜o declaramos um array
contendo msize ou MAX SIZE elementos.
Tarefa para voceˆs . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Como tornar a pilha ainda mais
flex´ıvel, sem limite de
tamanho?
Simples, usando alocac¸a˜o dinaˆmica na˜o declaramos um array
contendo msize ou MAX SIZE elementos.
Tarefa para voceˆs . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Templates podem ser usados para abstrair na˜o
apenas os tipos referenciados por classes, mas
tambe´m os tipos usados para estabelecer as
assinaturas das func¸o˜es.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Pense na func¸a˜o int sqr(int)
i n t s q r ( i n t x ) {
return x ∗ x ;
}
A princ´ıpio, ela poderia ser usada para calcular o quadrado de
nu´meros inteiros ou ponto flutuante. Podemos usar templates
para reusar essa implementac¸a˜o.
t e m p l a t e <c l a s s T>
T s q r (T x ) {
return x ∗ x ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Pense na func¸a˜o int sqr(int)
i n t s q r ( i n t x ) {
return x ∗ x ;
}
A princ´ıpio, ela poderia ser usada para calcular o quadrado de
nu´meros inteiros ou ponto flutuante.
Podemos usar templates
para reusar essa implementac¸a˜o.
t e m p l a t e <c l a s s T>
T s q r (T x ) {
return x ∗ x ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Pense na func¸a˜o int sqr(int)
i n t s q r ( i n t x ) {
return x ∗ x ;
}
A princ´ıpio,ela poderia ser usada para calcular o quadrado de
nu´meros inteiros ou ponto flutuante. Podemos usar templates
para reusar essa implementac¸a˜o.
t e m p l a t e <c l a s s T>
T s q r (T x ) {
return x ∗ x ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Pense na func¸a˜o int sqr(int)
i n t s q r ( i n t x ) {
return x ∗ x ;
}
A princ´ıpio, ela poderia ser usada para calcular o quadrado de
nu´meros inteiros ou ponto flutuante. Podemos usar templates
para reusar essa implementac¸a˜o.
t e m p l a t e <c l a s s T>
T s q r (T x ) {
return x ∗ x ;
}
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
A STL disponibiliza containers e algoritmos
Containers
vector, deque, list,
stack, queue, priority queue
map, set, bitset, . . .
Algoritmos
recuperar os valores ma´ximo / m´ınimo
ordenar os valores de uma lista
pesquisar e substituir os elementos de um container
iterators para navegar nos elementos de um container
map, fold, . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Antes de desenvolver um novo container ou
algoritmo que opere sobre containers, examine a
Standard Template Library
ou as classes em
java.util.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Antes de desenvolver um novo container ou
algoritmo que opere sobre containers, examine a
Standard Template Library ou as classes em
java.util.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Programac¸a˜o Orientada a Objetos
Java Generics
Rodrigo Bonifa´cio
4 de outubro de 2012
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Discusso˜es adicionais . . .
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
C++ Templates
x
Java Generics
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Principais diferenc¸as
Relacionadas a sistemas de tipos (Java tem uma
implementac¸a˜o mais robusta, apesar de ser menos
interessante que a implementac¸a˜o de C])
Relacionadas as capacidades de programac¸a˜o generativa, Java
e´ bastante limitado, fazendo com que os hackers de C++
percebem limitac¸o˜es claras na linguagem java.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Principais diferenc¸as
Relacionadas a sistemas de tipos (Java tem uma
implementac¸a˜o mais robusta, apesar de ser menos
interessante que a implementac¸a˜o de C])
Relacionadas as capacidades de programac¸a˜o generativa, Java
e´ bastante limitado
, fazendo com que os hackers de C++
percebem limitac¸o˜es claras na linguagem java.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Principais diferenc¸as
Relacionadas a sistemas de tipos (Java tem uma
implementac¸a˜o mais robusta, apesar de ser menos
interessante que a implementac¸a˜o de C])
Relacionadas as capacidades de programac¸a˜o generativa, Java
e´ bastante limitado, fazendo com que os hackers de C++
percebem limitac¸o˜es claras na linguagem java.
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
template<c l a s s T>
c l a s s Stack {
p r i v a t e :
i n t top ;
T s t a c k [ MAX SIZE ] ;
pub l i c :
Stack ( ) ;
. . .
vo id d r a w A l l ( ) ;
} ;
. . .
t e m p l a t e <c l a s s T>
vo id Stack<T> : : d r a w A l l ( ) {
wh i l e ( ! i sEmpty ( ) ) {
pop ( ) . draw ( ) ;
}
}
i n t main ( ) {
Stack<i n t> i n t s t a c k ;
f o r ( i n t i = 0 ; i < 1 0 ; i ++) {
i n t s t a c k . push ( i ) ;
}
// i n t s t a c k . d rawA l l ( ) ;
}
Esse co´digo compila em
C++
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
template<c l a s s T>
c l a s s Stack {
p r i v a t e :
i n t top ;
T s t a c k [ MAX SIZE ] ;
pub l i c :
Stack ( ) ;
. . .
vo id d r a w A l l ( ) ;
} ;
. . .
t e m p l a t e <c l a s s T>
vo id Stack<T> : : d r a w A l l ( ) {
wh i l e ( ! i sEmpty ( ) ) {
pop ( ) . draw ( ) ;
}
}
i n t main ( ) {
Stack<i n t> i n t s t a c k ;
f o r ( i n t i = 0 ; i < 1 0 ; i ++) {
i n t s t a c k . push ( i ) ;
}
// i n t s t a c k . d rawA l l ( ) ;
}
Esse co´digo compila em
C++
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Generative Programming
Mastering C++ templates
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics
Generative Programming
Mastering C++ templates
Rodrigo Bonifa´cio Programac¸a˜o Orientada a Objetos Java Generics

Outros materiais

Perguntas Recentes