Iterator Design Pattern (por debaixo dos panos)

Neste pequeno exemplo, utilizamos dos seguintes conceitos:

  • Generics
  • Inner Class
  • Iterator Design Pattern

O exemplo abaixo foi elaborado com a motivação de entender como deve funcionar o método ‘iterator()’ que retorna um objeto do tipo Iterator<T> das coleções já existentes no collections framework do java.
Neste exemplo, repare que criei uma classe interna
(MenuItensIterator) que implementa a interface Iterator. Como não faz sentido instancia-la fora do escopo da coleção MenuItens, então tornei-a privada e além do mais tornei seu construtor privado para evitar que se possa instanciá-la diretamente. Tornando-a privada, fica impossível de alguma variável de referência referenciá-la bem como instanciá-la:

MenuItens.MenuItensIterator mii = new MenuItens().new MenuItensIterator();

Tornando apenas seu construtor privado, fica impossível construir a mesma (mesmo que ela não fosse um membro privado da MenuItens (Outer Class)):

MenuItens.MenuItensIterator mii = new MenuItens().new MenuItensIterator();

A anotação de método @Override presente na classe MenuItensIterator não é obrigatória, mas serve para os indicar neste caso quais métodos da interface Iterator estão sendo implementados.

import java.util.Iterator;

import java.util.ArrayList;
// O código da classe Teste serve apenas para demonstrar a utilização.

public class Teste {

public static void main(String[] args){

MenuItens<String> mi = new MenuItens<String>();

mi.add(“Pedro”);

mi.add(“Juliane”);

mi.add(“Henrique”);

mi.add(“Lorena”);

Iterator<String> it = mi.iterator();

while(it.hasNext()) System.out.println(it.next());

}

}
class
MenuItens <T> {

private ArrayList<T> lst = new ArrayList<T>();

// Apenas implementei o método ‘add’ para adicionar itens a minha coleção de MenuItens.

public void add(T obj){

lst.add(obj);

}

// Classe concreta que implementa o Iterator para a coleção MenuItens.

private class
MenuItensIterator implements Iterator<T> {

private int i = 0;

// Evita a construção externa desta classe

private MenuItensIterator(){}

@Override

public boolean hasNext() {

try {

// A inner class pode acessar os membros da outer class.

lst.get(i);

return true;

} catch (IndexOutOfBoundsException ex){

return false;

}

}

@Override

public T next(){

return lst.get(i++);

}

@Override

public void remove(){}

}

// Método que retorna o objeto de iteração.

public Iterator<T> iterator() {

// A outer class pode acessar os membros privados da Inner Class. Por isso é permitido instanciar a classe MenuItensIterator desta forma. Caso contrário teriamos que montar um ‘factory method’ na classe MenuItensIterator.

return new MenuItensIterator();

}

}
Output:

Pedro

Juliane

Henrique

Lorena

Leia sobre outros artigos de Design Patterns

Anúncios
Esta entrada foi publicada em Design Pattern, Generics, inner class, Java com as etiquetas , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão /  Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s