Você está na página 1de 104

Especializao em web com interfaces

ricas

Conceitos avanados de programao

Prof. Fabrzzio Alphonsus A. M. N. Soares

fabrizzio@inf.ufg.br professor.fabrizzio@gmail.com
Instituto de Informtica
Universidade Federal de Gois

Aula 2
25 de maio de 2012

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 1/103


Conceitos avanados

Nesta aula conheceremos elementos interessantes para auxlio


na programao Java.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 2/103


Conceitos

Elementos que sero aprendidos nesta aula:


TypeCast e InstanceOf
Tipos genricos (Generics)
Encaixotamento (Boxing) e Envelopadores (Wrappers)
Colees, etc

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 3/103


TypeCast I

Quando lidamos com linguagens de programao fortemente


tipadas como Java, nos confrontamos muitas vezes com a ne-
cessidade de variar de um tipo de dado para outro.
H casos, tambm, em que at mesmo o compilador no com-
preende que tipo de dado estamos atribuindo a uma varivel.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 4/103


TypeCast II

Em Java, ns podemos fazer uso do que chamamos de induo


de tipo ou typecast.
O typecast dita ao compilador como tal dado deve ser interpre-
tado e manipulado.
Essa induo de tipo ou typecast pode ser implcita ou explcita.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 5/103


TypeCast III

O typecast implcito feito automaticamente pelo compilador


quando um tipo de dado pode ser facilmente manipulado no
lugar de outro tipo de dado.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 6/103


TypeCast IV

O typecast explcito feito diretamente no algortmo para in-


dicar ao compilador qual a forma de interpretao de um dado
quando ele entende que h ambiguidade ou formatos incompa-
tveis.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 7/103


TypeCast V

O typecast explcito dado sempre dentro de parnteses que


sempre vem antes do dado a ser induzido. Ex.: (int) var1,
(float) var2, (Object) var3, ...

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 8/103


TypeCast de Tipos Primitivos I

O typecast de dados primitivos dado basicamente em questo


de seu consumo de memria. Se tentamos designar um tipo de
dado que consome menos memria para um que consome mais
memria, o typecast realizado implicitamente.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 9/103


TypeCast de Tipos Primitivos II

No exemplo abaixo, atribuimos um dado inteiro (varInt) a uma


varivel do tipo float (varFloat).
1 public class ExemploTypecast1 {
2 public static void main(String[] args) {
3 float varFloat;
4 int varInt;
5 varInt = 200;
6 varFloat = varInt;
7 System.out.println(varFloat);
8 }
9 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 10/103


TypeCast de Tipos Primitivos III

O contrrio no se aplica. Tentar atribuir um tipo de dado


maior para um tipo de dado menor ir resultar em um erro de
tipos incompatveis (type mismatch).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 11/103


TypeCast de Tipos Primitivos IV

Para demonstrar isso, usaremos dois tipos de dados inteiros.


Porm, iremos atribuir um inteiro longo (que consome mais
memria) a um dado inteiro que consome menos. Nesse caso,
somos obrigados a usar typecast explcito.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 12/103


TypeCast de Tipos Primitivos V

1 public class ExemploTypecast2 {


2 public static void main(String[] args) {
3 long varLong;
4 int varInt;
5 varLong = 200;
6 varInt = (int) varLong;
7 System.out.println(varInt);
8 }
9 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 13/103


TypeCast de Classes e Objetos I

Typecast tambm pode ser usado em Classes e Objetos.


Sempre e uma classe for genrica, ela poder receber qualquer
tipo de objeto que ser feito o typecast implicitamente.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 14/103


TypeCast de Classes e Objetos II

Exemplo
Por exemplo, vamos utilizar a classe TV abaixo.
1 public class TV {
2 int tamanho;
3 int canal;
4 int volume;
5 boolean ligada;
6
7 public TV(int tamanho, int canal, int volume, boolean ligada
) {
8 this.tamanho = tamanho;
9 this.canal = canal;
10 this.volume = volume;
11 this.ligada = ligada;
12 }
13 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 15/103


TypeCast de Classes e Objetos III

Agora, vamos instanciar uma varivel da classe genrica Object


com a classe TV.
1
2 public class ExemploTypecast3 {
3 public static void main(String[] args) {
4 Object obj = new TV(29, 1, 0, false);
5 System.out.println("A varivel obj "
6 + obj.getClass());
7 }
8 }

Como podemos perceber, o resultado de getClass da varivel


obj no sua classe original (Object), mas sua instncia: class
TV.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 16/103


TypeCast de Classes e Objetos IV

Agora, no ser possvel criar uma cpia desse objeto para uma
varivel do mesmo tipo de sua instncia. Neste caso, devemos
fazer o typecast explcito da classe.
1 public class ExemploTypecast4 {
2 public static void main(String[] args) {
3 Object obj = new TV(29, 1, 0, false);
4 TV tv = (TV) obj;
5 TV tv2 = new TV(29, 1, 0, false);
6 System.out.println("A varivel tv cpia de obj" +
7 "\nobj: " + obj.toString() +
8 "\ntv: " + tv.toString());
9 System.out.println("TV2 outro objeto: " + tv2.toString
());
10 }
11 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 17/103


TypeCast de Classes e Objetos V

O resultado do cdigo acima seria algo como:


1 A varivel tv cpia de obj
2 obj: TV@12345f
3 tv: TV@12345f
4 TV2 outro objeto: TV@abcde1

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 18/103


InstanceOf I

No exemplo anterior, se tentssemos atribuir obj diretamente a


tv ocorreria um erro de tipos incompatveis (type mismatch).
Quando lidamos com classes, podemos testar qual seu tipo de
instancia usando o operador instanceof.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 19/103


InstanceOf II

Instanceof indica se um objeto (j instanciado) pertence a uma


classe.
O uso de instanceof : objeto instanceof nomeDaClasse.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 20/103


InstanceOf III
Para melhorar o exemplo anterior, usaremos instanceof antes de
atribuirmos obj a tv.
1 public class ExemploTypecast {
2 public static void main(String[] args) {
3 Object obj = new TV(29, 1, 0, false);
4 TV tv = null;
5 if (obj instanceof TV) {
6 tv = (TV) obj;
7 }
8 TV tv2 = new TV(29, 1, 0, false);
9 System.out.println("A varivel tv cpia de obj" +
10 "\nobj: " + obj.toString() +
11 "\ntv: " + tv.toString());
12 System.out.println("TV2 outro objeto: " + tv2.toString
());
13 }
14 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 21/103


Tipos Genricos I

O que so tipos genricos?


Generics, ou programao genrica, serve para determinar para
o compilador, qual tipo de classe deve ser interpretada.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 22/103


Tipos Genricos II

Por exemplo, vamos imaginar que ser criada uma classe cha-
mada Aparelho que ir conter um objeto de alguma outra classe.
Para que essa classe possa aceitar qualquer tipo de classe, de-
vemos fazer uso de generics.
Generics indicado como um identificador entre os sinais de
maior e menor < > .

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 23/103


Criar classes usando generics I

Para criar uma classe usando generics, basta que logo aps o
nome da classe coloquemos o indicador genrico. Esse indica-
dor genrico simplesmente uma letra na qual ser substituda
dentro da classe no momento da execuo.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 24/103


Criar classes usando generics II
1 public class Aparelho <T> {
2 T objeto;
3
4 public Aparelho(T objeto) {
5 this.objeto = objeto;
6 }
7
8 public T getObjeto() {
9 return objeto;
10 }
11
12 public void setObjeto(T objeto) {
13 this.objeto = objeto;
14 }
15 }

Como a letra T identifica um tipo genrico, ela ser substituda


por qualquer classe.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 25/103


Criar classes usando generics III
Vamos imaginar agora que temos duas classes distintas. A classe
TV:
1 public class TV {
2 int tamanho;
3 int canal;
4 int volume;
5 boolean ligada;
6
7 public TV(int tamanho, int canal, int volume, boolean ligada
) {
8 this.tamanho = tamanho;
9 this.canal = canal;
10 this.volume = volume;
11 this.ligada = ligada;
12 }
13 // mtodos get e set
14 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 26/103


Criar classes usando generics IV

E a classe radio:
1 public class Radio {
2 public static int AM = 1;
3 public static int FM = 2;
4 private float frequencia;
5 private int volume;
6 private int banda;
7
8 public Radio(float frequencia, int volume, int banda) {
9 this.frequencia = frequencia;
10 this.volume = volume;
11 this.banda = banda;
12 }
13 // mtodos get e set
14 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 27/103


Instanciar uma classe genrica I

Se fossemos criar um programa que usa as duas classes de apa-


relhos acima, faramos:
1 public class MinhaClasse {
2 public static void main(String[] args) {
3 Aparelho<TV> aparelho1 = new Aparelho<TV>(new TV(29, 0,
0, false));
4 Aparelho<Radio> aparelho2 = new Aparelho<Radio>(new
Radio(88.1f, 0, Radio.FM));
5 System.out.println(aparelho1.getObjeto().getClass());
6 System.out.println(aparelho2.getObjeto().getClass());
7 }
8 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 28/103


Instanciar uma classe genrica II

Perceba o seguinte: sem o uso de generics, o compilador no


conseguiria saber qual a diferena entre aparelho1 e aparelho2,
pois ele os trataria da mesma forma. Nesse caso, seria obriga-
trio o uso de typecast para determinar ao compilador que dado
est sendo processado.
Se pensarmos em uma aplicao muito grande, alm de ficar
cansativo ter que usar typecast toda vez que fossemos usar
um aparelho, seria muito provvel que erraramos em algum
momento.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 29/103


Instanciar uma classe genrica III

Java usa uma pequena conveno de nomenclatura para as le-


tras de identificao de generics (que so vastamente utilizadas
no Framework de colees Java), sendo:
E Elemento
K Chave
N Nmero
T Tipo
V Valor

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 30/103


Generics um assunto bastante extenso com vrios tpicos
que podem ser abordados, dentre os quais podemos citar:

Multiplos tipos genricos. Ex.: <T, E, N>;

Tipos genricos limitados. Ex.: <U extends Number>;

Wildcards;

e Subtipos;
Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 31/103
Exemplo mais robusto I

Iremos criar duas classes, a primeira Obj contm dois mtodos


(add e get) que recebem e retornam um tipo Integer.
1 public class Obj {
2
3 private Integer i;
4
5 public void add(Integer i){
6 this.i = i;
7 }
8 public Integer get(){
9 return this.i;
10 }
11 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 31/103


Exemplo mais robusto II

A segunda classe utiliza a classe Obj para guardar um objeto:


1 public class UsaObj {
2
3 public static void main(String[] args) {
4
5 Obj integerObj = new Obj();
6 integerObj.add(new Integer(10));
7
8 Integer someInteger = (Integer)integerObj.get();
9 System.out.println(someInteger);
10 }
11 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 32/103


Exemplo mais robusto III

O exemplo abaixo ir causar erro:


1 public class UsaObj {
2
3 public static void main(String[] args) {
4
5 Obj stringObj = new Obj();
6 stringObj.add("Teste");
7
8 String someString = (String)stringObj.get();
9 System.out.println(someString);
10 }
11 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 33/103


Exemplo mais robusto IV

No caso acima, somente possvel colocar em Obj um objeto


do tipo Integer, agora veremos como tipos genricos pode nos
ajudar quando queremos colocar um Integer ou uma String na
classe Obj por exemplo. Vamos recriar o cenrio anterior com
a utilizao de tipos genricos.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 34/103


Usando Generics I

Veja que agora o tipo de objeto que ser armazenado repre-


sentado pela letra T, que tambm dever ser informado quando
uma instncia de Obj for criada.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 35/103


Usando Generics II

1 public class ObjGen<T>{


2
3 private T t; // T o tipo do objeto
4
5 public void add(T t){
6 this.t = t;
7 }
8 public T get(){
9 return this.t;
10 }
11 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 36/103


Usando Generics III
Agora vamos criar uma classe que utiliza a classe ObjGen.
1 public class UsaObjGen {
2
3 public static void main(String[] args) {
4
5 ObjGen<Integer> integerObj = new ObjGen<Integer>();
6 integerObj.add(new Integer(10));
7
8 Integer someInteger = (Integer)integerObj.get();
9 System.out.println(someInteger);
10
11 ObjGen<String> stringObj = new ObjGen<String>();
12 stringObj.add("Teste");
13
14 String someString = (String)stringObj.get();
15 System.out.println(someString);
16 }
17 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 37/103


Generics como tipo mnimo I

Podemos utilizar um tipo mnimo para garantir um tipo obri-


gatrio quando criamos classes genricas.
1 public class ObjMin <T extends Runnable> {
2
3 void inicia(T t){
4 new Thread(t).start();
5 }
6 }

Aqui estamos definindo que o tipo do objeto (T) deve ser no


mnino um Runnable.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 38/103


Generics como tipo mnimo II

Criaremos agora uma classe chamada Programa que implementa


Runnable e utiliza o ObjMin.
1 public class Programa implements Runnable {
2
3 public static void main(String[] args){
4
5 ObjMin<Programa> o = new ObjMin<Programa>();
6 o.inicia(new Programa());
7 }
8
9 public void run(){
10 System.out.println("ola");
11 }
12 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 39/103


Boxing, Unboxing e Autoboxing I

O que boxing?
Em certas situaes, mais conveniente utilizar objetos no lugar
de tipos primitivos (byte, short, int, long, float, double, boolean
e char).
Assim, para cada tipo primitivo, foi criado uma classe Wrapper
(Byte, Short, Integer, Long, Float, Double, Boolean e Charac-
ter) que serve para encaixotar (boxing) o tipo primitivo.
Boxing consiste em inserir um tipo primitivo dentro de um ob-
jeto, de forma que o valor primitivo possa ser usado como um
objeto.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 40/103


Boxing, Unboxing e Autoboxing II

Vejamos este Exemplo:


1 Integer i = new Integer(100);

Vemos neste exemplo que o tipo primitivo int de valor 100


inserido no construtor de Integer, que a classe wrapper (em-
pacotadora) associada.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 41/103


Wrappers I

Tabela de Tipos primitivos e Classes Wrappers

Tipo primitivo Classe Wrapper Super Classe


Lgico boolean Boolean Object
Caractere char Character Object
Inteiro byte Byte Number
Inteiro short Short Number
Inteiro int Integer Number
Inteiro long Long Number
Ponto Flutuante float Float Number
Ponto Flutuante double Double Number

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 42/103


Wrappers II

Classes Wrappers possuem mtodos pblicos disponveis na sub-


classe Object, devemos dar um maior destaque para os mtodos
equals(Object) e toString, o primeiro utilizado para compara-
es enquanto que o segundo permite que o contedo de um
objeto seja representado em formato de texto.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 43/103


Wrappers III

Classes derivadas da subclasse Number possuem vrios mto-


dos para devolverem um tipo primitivo, tais como: byteValue(),
shortValue(), intValue(), longValue(), doubleValue(), floatVa-
lue().

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 44/103


Wrappers IV

Alem disso a as classes derivadas de Number possuem tambm


o mtodo comparareTo(Object) que faz comparaes entre ob-
jetos wrapper.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 45/103


Quais as vantagens de usar tipos
primitivos? I

Tipos primitivos so bem rpidos


Consomem pouca memria
Alm de permitirem operaes mais complexas
So bastantes eficientes em laos e expresses

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 46/103


Usando Wrappers I

Para criar objetos Integer ,Double , etc.


Basta apenas chamar :
1 Integer i = new Integer();
2 Double d = new Double();

Para fazer obter uma valor encapsulado basta apenas:


1 float f = real.FloatValue();
2 double d = inteiro.doubleValue();

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 47/103


Autoboxing I

A criao das classes wrapper resolveram vrios problemas, po-


rm a converso entre tipo primitivo para objeto (boxing) e
objeto para primitivo (unboxing) se tornou uma tarefa trivial e
tediosa. A soluo surgiu a partir do JDK 1.5.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 48/103


Autoboxing II

A Sun resolveu este problema atravs do autoboxing, que con-


siste no boxing automtico, ou seja, na converso automtica
pelo compilador de tipo primitivo para objeto.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 49/103


Autoboxing III

Alm do autoboxing, existe o autounboxing, que a conver-


so automtica de objeto para tipo primitivo. Assim, fecha-se
o ciclo: a converso de tipo primitivo para tipo wrapper au-
tomtica (autoboxing) e o retorno tambm automtico (au-
tounboxing), facilitando o uso de um e outro, como se fossem
equivalentes.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 50/103


Autoboxing IV

Vejamos o exemplo:
1 public class TesteAutoboxing {
2 public static void main(String[] args) {
3 Integer a = 2; // autoboxing
4 Integer b = 2; // equivale a Integer b = new Integer(2);
5 a++; // autounboxing e autoboxing
6 b++; // autounboxing e autoboxing
7 // int x = a.intValue(); // para jdk < 1.5, isto era
necessrio
8 // int y = b.intValue();
9 // System.out.println(x+y); // a linha abaixo equivalente
a esta
10 System.out.println(a+b); // graas a autounboxing
11 }
12 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 51/103


Autoboxing V

Note neste exemplo:


O compilador sabe que a atribuio Integer a = 2 so
de tipos diferentes, por isso necessrio autoboxing - a
converso implcita pelo compilador de int para Integer.
A soma de objetos no definida, por isso a e b so
convertidos implicitamente pelo compilador para int;
Em geral, o cdigo-fonte fica mais curto e operaes de
converses triviais so criadas implicitamente pelo
compilador.
Voc pode utilizar os operadores de incremento em
objetos, como se fossem tipos primitivos;

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 52/103


Exemplos de Autoboxing I

Autoboxing ou autounboxing ocorre sempre que houver a neces-


sidade de converso de tipos primitivos em objetos e vice-versa.
Isto se aplica em vrias situaes [3]: comparao, atribuio,
em estruturas de repetio, etc. Veremos a seguir um exemplo
de cada situao.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 53/103


Autoboxing em atribuio I
Veja no exemplo abaixo a utilizao de autoboxing e autounbo-
xing na atribuio de variveis e passagem de parmetros para
mtodos:
1 public class AutoboxingEmAtribuicao {
2 private static double soma(double x, double y) { //
autounboxing
3 return x+y;
4 }
5 public static void main(String[] args) {
6 Double a = 1.0; //autoboxing
7 Double b = 1.0; // autoboxing
8 Double resultado = soma(a,b); // autounboxing
9 Boolean imprimir = true; ///autoboxing
10 if (imprimir) // autounboxing
11 System.out.println("resultado: "+resultado); //autounboxing
12 }
13 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 54/103


Autoboxing em atribuio II

Note a atuao do autoboxing/autounboxing neste exemplo:


Na atribuio de valores double para tipos objeto Double;
Na passagens de parmetros do mtodo soma. Note que
o mtodo soma recebe como parmetros dois tipos
primitivos double e foram passados dois objetos Double
a e b.
Na atribuio do valor booleano true varivel do tipo
objeto Boolean;
No uso de um tipo objeto Boolean na condio do if;

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 55/103


Autoboxing em comparao I

Comparaes podem ser realizadas atravs do operador ==


ou pelo mtodo equals; o primeiro, quando aplicado entre
objetos, compara se as variveis referenciam o mesmo objeto,
enquanto que o segundo avalia se os objetos possuem o valor
significativamente iguais.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 56/103


Autoboxing em comparao II
Veremos no cdigo-fonte de exemplo a seguir, que as compara-
es entre tipos diferentes podem ser realizadas:
1 public class AutoboxingEmComparacao {
2 public static void main(String[] args) {
3 Integer a = new Integer(2);
4 Integer b = new Integer(2);;
5 int c = 2;
6 // compara se a e b referenciam o mesmo objeto:
7 if (a == b)
8 System.out.println("Comparao 1: a e b so os mesmos
objetos");
9
10 // compara se a e b possuem o mesmo valor:
11 if (a.equals(b))
12 System.out.println("Comparao 2: a e b tem valores iguais")
;
13
14 // a convertido para tipo primitivo
15 // os dois valores so comparados como tipos primitivos
16 if (a == c)

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 57/103


Autoboxing em comparao III

17 System.out.println("Comparao 3: a e c tem valores iguais")


;
18
19 // c convertido para objeto
20 // os dois valores so comparados como objetos
21 if (a.equals(c))
22 System.out.println("Comparao 4: a e c tem valores iguais")
;
23 }
24 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 58/103


Autoboxing em comparao IV

Note a atuao do autoboxing/autounboxing neste exemplo:


Na comparao entre tipos diferentes (objeto e tipo
primitivo);
No comportamento diferente na comparao com ==
ou equals;

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 59/103


Autoboxing em lao de repetio for I
A partir do jdk 1.5, surgiu uma melhoria na estrutura de repeti-
o for, chamado de for melhorado ou enhanced for. Atravs
do novo for, possvel percorrer toda uma array ou conjunto
(veremos mais detalhadamente sobre isso depois) de forma bem
fcil, sem necessitar criar contadores ou ndices.
1 for (Tipo item: array_ou_conjunto)...

Onde:
Tipo - uma classe ou algum tipo primitivo;
item - a varivel que receber um elemento do array ou
conjunto em cada iterao (loop);
array_ou_conjunto - uma array ou conjunto contendo
vrios elementos;
Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 60/103
Autoboxing em lao de repetio for II
Veremos o uso do for melhorado neste exemplo a seguir. Note
que iremos percorrer uma array de tipos primitivos char e uma
array (objeto) de inteiros (Integer):
1 import java.util.ArrayList;
2 public class AutoboxingEmRepeticaoFor {
3 public static void main(String[] args) {
4 char[] ola = {o, l, a};
5 // percorre a array ola
6 for (Character letra: ola) // autoboxing
7 System.out.println(letra);
8
9 // esta um array com vrios elementos inteiros;
10 // veremos esta sintaxe quando for estudado "Genericos"
11 ArrayList<Integer> numerospares = new ArrayList<Integer>();
12
13 // inclui objetos inteiros no array
14 numerospares.add(new Integer(2));
15 numerospares.add(new Integer(4));
16 numerospares.add(new Integer(6));

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 61/103


Autoboxing em lao de repetio for III

17 numerospares.add(new Integer(8));
18
19 // realiza o autounboxing de cada elemento Integer
20 for (int i: numerospares)
21 System.out.println(i);
22 }
23 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 62/103


Autoboxing em lao de repetio for IV

Note neste exemplo:


O for melhorado percorre a array de tipos primitivos char,
realizando o autoboxing de cada um de seus elementos,
atribuindo a varivel letra, que do tipo objeto
Character;
A sintaxe ArrayList<Integer> numerospares = new
ArrayList<Integer>(), tem o seguinte significado: crie
uma array de objetos Integer, associando varavel
numerospares, que por sua vez uma array de Integer;
O for melhorado percorre a array de Integer, realizando o
autounboxing de cada um de seus elementos, atribuindo a
varivel i, que do tipo primitivo int;

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 63/103


Colees I

Um dos conceitos mais difundidos entre todas as linguagens de


programao o conceito de array.
Embora seja a base de muita coisa nem sempre trabalhar com
arrays diretamente uma boa ideia.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 64/103


Colees II

O Java Collections Framework um conjunto de classes de-


senhados para superar as limitaes dos arrays e aumentar a
capacidade do programador para trabalhar com colees de ob-
jetos.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 65/103


Colees III

Com classes de alto nvel como estas possvel implementar


padres como Produtor-Consumidor sem esforo. Ou escolher
a implementao mais eficiente sem a implementar.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 66/103


Sobre Arrays I

Um array, em java, um objeto que agrega outros objetos que


compartilham um supertipo comum e aos quais nos podemos
referir por um ndice (ou seja, um numero inteiro).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 67/103


Sobre Arrays II

Arrays em java so imutveis o que significa que para criar


um array menor ou maior baseando-nos num que j existe
necessrio criar um novo array e fazer uma cpia, elemento a
elemento do antigo para o novo.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 68/103


Sobre Arrays III
Arrays so muito uteis para substituir condies de seleo,
como vemos no exemplo a seguir:
1 // sem array
2 public String getDayOfWeek(int weekDayOrdinal){
3 switch(weekDayOrdinal){
4 case 1: return "Domingo";
5 case 2: return "Segunda-Feira";
6 case 3: return "Tera-Feira";
7 case 4: return "Quarta-Feira";
8 case 5: return "Quinta-Feira";
9 case 6: return "Sexta-Feira";
10 case 7: return "Sbado";
11 }
12 }
13 // com array
14 public String getDayOfWeek(int weekDayOrdinal){
15 return WEEK_DAY_NAMES[weekDayOrdinal-1];
16 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 69/103


Sobre Arrays IV

Esta uma situao simples que pode no parecer muito vanta-


josa ainda para mais quando seria necessrio inicializar o array
( embora, essa inicializao seria feita apenas uma vez em toda
a vida do programa).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 70/103


Sobre Arrays V

A razo para que o Array seja um objeto pouco malevel de


eficincia. Mas java oferece um recurso muito mais poderoso
que permite ao programador no usar arrays se no quiser : o
Java Collections Framework (JCF).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 71/103


Java Collections Framework I

O Java Collections Framework um conjunto de interfaces e


classes que permitem uma vasta gama de opes na hora de
trabalhar com agregaes de objetos. A recente (Java 5) in-
troduo de tipos genricos e de colees desenhadas para am-
bientes concorrentes no devem deixar dvidas a ninguem, que
em Java, usar arrays no o padro a seguir.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 72/103


Java Collections Framework II

Os algoritmos existentes relativos a colees so amplamente


divulgados e estudados. A eficincia a prioridade ao trabalhar
com grandes colees de objetos. Por esse motivo, o JCF
bastante flexvel e vasto. Esses algoritmos so to importantes
que obrigam todos os objetos a seguir contratos bem definidos.
O primeiro e mais importante deles o contrato de definio de
igualdade.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 73/103


Definindo igualdade com equals I

Em Java o operador de igualdade == no determina se os ob-


jetos so iguais, apenas se as variveis de referencia a eles so
iguais. Duas variveis de referencia a objetos podem referenciar
objetos iguais ou no.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 74/103


Definindo igualdade com equals II

Para resolver o problema todos os objetos em Java definem o


mtodo equals(). Este mtodo definido em Object - a classe
me de todas as classes - e como tal o mtodo onipresente na
linguagem.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 75/103


Definindo igualdade com equals III

Por padro, este mtodo apenas verifica se as referncias dos


objetos so iguais. Ou seja, por padro, um objeto s igual
a outro se a varivel de referencia a mesma. Isso garante
que objeto quando igual tem as mesma caractersticas, mas
muitas vezes necessitamos que a igualdade seja determinada
pelas caractersticas em si e no pela referncia do objeto.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 76/103


Definindo igualdade com equals IV

Para conseguirmos isso basta sobre-escrever o mtodo equals()


no nosso objeto. Para fazermos isso temos que seguir algumas
regras:
1 O resultado de invocar equals() para os mesmos dois
objetos, sempre retorna o mesmo resultado
independentemente de quando essa invocao feita.
2 null nunca igual a nenhum objecto
3 Um objeto igual a si prprio. Ou seja, a.equals(a) tem
que ser verdade.
4 A ordem da invocao para dois objetos no importa. Se
a.equals(b) verdade ento tambm tem que ser verdade
que b.equals(a)

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 77/103


Definindo igualdade com equals V

5 Se a.equals(b) e b.equals(c) so verdade ento tambm


tem que ser verdade que a.equals(c)

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 78/103


Definindo igualdade com equals VI

Esta regras traduzem as propriedades do mtodo equals(). Se


o mtodo no tem estas propriedades ele no est bem imple-
mentado. A saber:
1 equals() Consistente
2 e consistente com null
3 equals() Reflexivo
4 equals() Simtrico
5 equals() Transitivo

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 79/103


HashCode I

Hash um cdigo desenvolvido em criptografia. Funo de


Hash um mecanismo que baseado numa entrada produz um
cdigo de hash (hashCode). Funes de Hash no so rever-
siveis e sempre produzem o mesmo resultado para a mesma
entrada. Contudo no so obrigadas a produzirem cdigos di-
ferentes para entradas diferentes ( ou seja, no so injetivas).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 80/103


HashCode II

Por outro lado, funes de hash produzem cdigos do mesmo


tamanho para entradas de tamanhos aleatoriamente diferentes.
Estas propriedades so extremamente uteis j que pela simples
comparao do cdigo de hash poderemos saber se dois objetos
so diferentes. Ateno para o fato que elas no revelam se
os objetos so iguais, mas na maioria dos casos ser diferente
mais importante que ser igual.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 81/103


HashCode III

Sabendo disto, semelhana de equals() Object tambm de-


fine o mtodo hashCode() que no mais que uma funo de
hash aplicada ao prprio objeto. fcil de compreender que
se alteramos o mecanismo padro de verificao de igualdade,
temos tambm que alterar o mecanismo padro de produo do
cdigo de hash.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 82/103


HashCode IV

Isso nos leva regra de consistncia que diz que: Sempre que
sobrescrever equals() sobrescreva tambm hashCode() de forma
compatvel. De forma compatvel significa que : Se a.equals(b)
verdade ento tambm verdade que a.hashCode()==b.hashcode()

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 83/103


HashCode V

Existem muitas formas de redefinir o calculo do cdigo de hash.


Da mais simples e com pior performance que fazer todos os
objetos terem o mesmo cdigo at mais complexa de deixar
todos os objetos terem um cdigo diferente.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 84/103


HashCode VI

Embora seja teoricamente possvel ter uma funo de hash to


eficiente que produz um cdigo diferente para cada objeto di-
ferente, na prtica nos encontramos limitados j que o cdigo
tem que caber num int (32 bits).

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 85/103


HashCode VII

Ento temos que vier com fato que nossas funes de hash vo
produzir cdigo iguais em algum ponto. A isso se chama Coliso
de Hash. O objetivo diminuir as colises, ou seja diminuir a
frequencia com que dois objetos diferentes produzem o mesmo
cdigo de hash. Quanto menos colises, mais eficiente a nossa
funo de hash.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 86/103


HashCode VIII

A funo de hash mais simples a operao de ou-exclusivo


(XOR) que em Java se representa pelo operador .

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 87/103


Colees e Mapas I
So classes voltadas para estruturas de dados,
pertencentes ao pacote java.util:
Conjuntos
Conjuntos
ordenados
Mapas
Mapas Ordenados e
listas.
largamente utilizado em programas: quem no precisa
de um vetor, uma lista ou conjunto?
Melhora a performance e a qualidade: evita reinventar a
roda;
Estimula o reuso;
So conhecidos tambm como conjuntos;
Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 88/103
Organizao em Interfaces e Classes I

O conjunto de classes java para colees (Java Collection Fra-


mework) composto de vrias interfaces (I), e classes concretas
(C). A seguir mostramos estas classes no formato hierrquico
em rvore:
1 Collection (I)
2 Set (I)
3 HashSet (C)
4 Sorted Set (I)
5 TreeSet(C)
6 List (I)
7 ArrayList (C)
8 Vector (C)
9 LinkedList (C)
10 Queue (I)
11 ...
12 Map (I)
13 HashMap (C)
14 Hashtable (C)

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 89/103


Organizao em Interfaces e Classes II

15 SortedMap (I)
16 TreeMap (C)

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 90/103


Definindo cada uma das implementaes
I

1 Colees
Collection: interface que define operaes comuns de
colees. Esta interface possui duas sub-interfaces - Set
(Conjunto) e List (Lista);
2 Conjuntos
Set: implementao de Collection, que modela um
conjunto de elementos nicos;
HashSet: implementao de Set, modela conjuntos no
ordenados;
SortedSet: implementao de Set, modela conjuntos
ordenados;
3 Listas
Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 91/103
Definindo cada uma das implementaes
II

List: modela listas de dados, onde os elementos


(repetidos ou no) esto ordenados;
ArrayList: usa mtodos no-sincronizados e Vector utiliza
mtodos sincronizados (synchronized)
Vector: apropriado para uso em multithread, porm
mais lento que ArrayList;
LinkedList: uma Lista, onde os elementos esto
ligados. Tem uma insero e deleo muito mais rpidos
que ArrayList e Vector.
4 Mapas
Map: modela mapeamentos entre chaves no-repetidas a
valores;

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 92/103


Definindo cada uma das implementaes
III

HashMap: subclasse de Map, modela mapas no


classificados, com mtodos no-sincronizados;
Hashtable: subclasse de Map, modela mapas no
classificados, com mtodos sincronizados;
SortedMap: modela mapas classificados;
5 Filas
Queue: uma interface, que modela filas,

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 93/103


Definindo cada uma das implementaes
IV

No confunda array (criados com []) com as classes ArrayList


ou Vector!

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 94/103


Exemplo comparativo entre array e
ArrayList I

Veja a tabela comparativa

array ArrayList
no tem dimenso dinmica tem dimenso dinmica
suporta tipos primitivos no suporta tipos primitivos diretamente
no uma classe uma classe
no suporta mtodos suporta mtodos
possui atributo length no possui atributo length

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 95/103


Exemplo comparativo entre array e
ArrayList II
Veja o exemplo abaixo, comparando array e ArrayList:
1 import java.util.ArrayList;
2 public class ComparandoArrayEArrayList {
3 public static void main(String[] args) {
4 // inicializao:
5 String[] ola1 = new String[3];
6 ArrayList<String> ola2 = new ArrayList<String>();
7
8 // atribuio
9 ola1[0] = "o"; ola1[1] = "l"; ola1[2] = "a";
10 ola2.add("o"); ola2.add("l"); ola2.add("a"); ola2.add("!");
11
12 // percorrendo com for
13 for (String s: ola1)
14 System.out.print(s);
15 System.out.println();
16 for (String s: ola2)
17 System.out.print(s);

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 96/103


Exemplo comparativo entre array e
ArrayList III

18 }
19 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 97/103


Interface Collection I

A interface Collection define vrias operaes bsicas e opera-


es entre colees. Vejamos sua implementao:
1 public interface Collection<E> extends Iterable<E> {
2 // Operaes Bsicas
3 int size();
4 boolean isEmpty();
5 boolean contains(Object element);
6 boolean add(E element);
7 boolean remove(Object element);
8 Iterator<E> iterator();
9
10 // Operaes em massa
11 boolean containsAll(Collection<?> c);
12 boolean addAll(Collection<? extends E> c);
13 boolean removeAll(Collection<?> c);
14 boolean retainAll(Collection<?> c);
15 void clear();
16
17 // Operaes de array

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 98/103


Interface Collection II

18 Object[] toArray();
19 <T> T[] toArray(T[] a);
20 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 99/103


Interface Iterator I

Uma interface bastante importante a interface Iterator, que


permite navegar (iterar) pelos vrios elementos de uma coleo.
1 public interface Iterator<E> {
2 boolean hasNext();
3 E next();
4 void remove();
5 }

Note que a interface Iterator bastante simples, um Iterator


obtido da prpria coleo atravs do mtodo iterator() e depois
podemos navegar pela coleo por meio dos mtodos hasNext(),
next() e remove();

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 100/103


Exemplo simples I

1 import java.util.*;
2 public class TesteArray {
3 public static void main(String[] args) {
4 ArrayList<String> a1 = new ArrayList<String>();
5 ArrayList<String> a2 = new ArrayList<String>();
6 a1.add("a");
7 a1.add("b");
8 a1.add("c");
9 a2.add("d");
10 a2.add("e");
11 a2.add("f");
12 Iterator i1 = a1.iterator();
13 Iterator i2 = a2.iterator();
14 // imprime a1
15 while (i1.hasNext()) {
16 System.out.println(i1.next());
17 }
18 // imprime a2
19 while (i2.hasNext()) {
20 System.out.println(i2.next());

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 101/103


Exemplo simples II

21 }
22 }
23 }

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 102/103


Exerccio

1 Criando somente uma instncia auxiliar de ArrayList,


adicione os elementos de a2 em a1, de forma mesclada,
ou seja, seu resultado final dever ser: a, d, b, e, c, f.
Imprima o novo a1 resultante.
2 Sem criar novas instncias de ArrayList, adicione os
elementos de a1 no final de a2 e imprima o novo a2
resultante.

Prof. Fabrzzio Alphonsus A. M. N. Soares | Conceitos avanados de programao 103/103

Você também pode gostar