Baixe o app para aproveitar ainda mais
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
Compartilhar