02 setembro 2009

SCJP - 07 - Collections [parte 01]

E lá vou eu, ainda estudando muito pouco sobre a certificação. Mas aos poucos a gente vai lendo, e pelo menos tem noção do que é cobrado ou não no exame. Hoje, o assunto são as coleções do Java 6.


Esta imagem, retirada do livro da SCJP 6, demonstra bem o que a api fornece em termos de classes, interfaces e utilitarios:


Pelo diagrama de classes exibido acima, já podemos esclarecer algo importante: Nem todas as classes concretas herdam de Collection. É o caso, obviamente, das classes utilitárias (Collections e Arrays), e de todas as classes/interfaces relacionadas a Map (SortedMap, HashMap, Hashtable, TreeMap, LinkedHashMap e NavigableMap). Lembre-se disso ao tentar fazer conversões (cast) entre estes tipos.

Existem quatro comportamentos básicos, como também é visto no diagrama acima: as listas (List), os conjuntos (Set), os mapas (Map) e as filas (Queue). Falando dos mais complexos: os mapas relacionam uma chave, que pode ser qualquer coisa (desde que herde de Object) com um valor qualquer (também herdando de Object). Assim, vc pode mapear Integers em Strings, Strings em outros Maps, e por ai vai. As filas funcionam como uma lista de prioridades, ora implementadas como FIFO (first-in-first-out, ou primeiro a entrar é o primeiro a sair) ou como LIFO (last-in-first-out, ou ultimo a entrar é o primeiro a sair, também conhecido como pilha ou stack).

Existem também dois conceitos chave no que se refere a coleções em Java: ordenação e classificação. Existem coleções não ordenadas e não classificadas, coleções ordenadas e não classificadas, e coleções ordenadas e classificadas. Não existem coleções classificadas e não ordenadas, porque classificação é um tipo específico de ordenação. Qual a diferença entre um e outro? Até eles admitem que é um tanto confuso :P

Ordenação e Classificação


Ordenação se refere a como os elementos lhe são apresentados durante uma iteração sobre a coleção. Ao iterar sobre uma coleção, você espera encontrar elementos dispostos em uma ordem (não randômica). Algumas coleções mantém a ordem dos elementos baseadas num índice, outras baseadas no método de inserção (sempre ao final, por exemplo).

Classificação é um tipo de ordenação que toma por base propriedades do próprio objeto. A mais comum é a classificação natural, como por exemplo a alfabética ou a numérica. Quando não existe uma classificação natural para os objetos de uma classe, é preciso definí-la programaticamente, usando uma de duas alternativas: as interfaces Comparable e Comparator.

Para a primeira das alternativas, as classes passivas de classificação devem implementar a interface Comparable, que exige apenas a implementação do método compareTo().

public class Pessoa implements Comparable<Pessoa> {
    private String nome;
    ...
    public int compareTo(Pessoa pessoa) {       
        //Lembrando que String implementa Comparable 
        return this.getNome().compareTo(pessoa.getNome());
    }
}

O contrato para este método é:
  • Deve ser um método público, retornar um inteiro primitivo, e receber como parâmetro, um objeto da própria classe.
  • Retorne 0, se o objeto em questão for logicamente igual que o objeto passad como parâmetro.
  • Retorne um inteiro negativo, se o objeto em questão for logicamente menor que o objeto passado como parâmetro.
  • Retorne um inteiro positivo, se o objeto em questão for logicamente maior que o objeto passado como parâmetro

Para a segunda alternativa, é preciso criar uma classe em separado, que implemente a interface Comparator:

import java.util.*;
public class PessoaComparator implements Comparator<Pessoa> {
    public int compare(Pessoa a, Pessoa b) {
        //Lembrando que String implementa Comparable
        return a.getNome().compareTo(b.getNome());
    }
}

O que diferencia uma da outra, em termos do contrato de implementação, é apenas a assinatura do método: precisa receber duas instâncias da classe passível de classificação. A lógica de retorno é a mesma definida para a interface Comparable.

Uma observação importante, é que devemos (ou deveríamos) verificar se os objetos são mutuamente comparáveis. Geralmente, não gostaríamos que fosse possível comparar instâncias de Pombo e Jacare, por exemplo. Isso só deve acontecer em casos bem específicos.



Creative Commons License
Esta obra está licenciada sob uma Licença Creative Commons.
Comentários
0 Comentários

0 comments:

Postar um comentário

Regras são chatas, mas...

- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;