Collections.unmodifiableList!

2 respostas
J

Dae galera... quando é necessário a utilização desse método da Collections unmodifiableList??
Tipo...eu tenho os meu DAO implementado assim:

public List getAll() throws Exception {
        List lista = new ArrayList();
        try {            
            ALStatement sta = new ALStatement();
            sta.setSQL("select * from TipoTelefone order by DescTipoTelefone");
            sta.parse();            
            sta.execute();
            while( sta.fetch()) {                
                TipoTelefoneVO tipo = new TipoTelefoneVO();
                tipo.setCodTipoTelefone(Integer.parseInt(sta.getField("CodTipoTelefone")));
                tipo.setTipoTelefone(sta.getField("DescTipoTelefone"));
                if( !"".equals(sta.getField("SituacaoTipoTelefone")) && sta.getField("SituacaoTipoTelefone") != null )
                    tipo.setSituacaoTipoTelefone(Integer.parseInt(sta.getField("SituacaoTipoTelefone")));
                lista.add(tipo);                
            }     
            sta.close();            
                        
        } catch( Exception e ) {
            throw new ALException(e.getMessage() + " TipoTelefoneDAO :: getAll" );
        }
        return lista;
    }

E chamo eles assim:

DocumentoDAO.getInstance().getAll() ;

O sistema é web.. então.. eu teria que utilizar esse método?? Não entendi quais casos exatamente ele deve ser usado..
Abraço!

2 Respostas

R

Esse método retorna a lista que foi passada como parâmetro, com uma diferença: ela agora é imutável. Ou seja, não pode ser adicionados ou removidos elementos dessa lista.

V

Ele quase nunca vai ser necessário se vc retornar uma cópia da lista....

Mas suponha que vc tenha uma classe, que controla uma lista de qualquer coisa internamente:

public class Turma {
    private List<Alunos> alunos = new ArrayList<Alunos>();

    public void getAluno(int numeroChamada) {...};
    public void adicionar(Aluno aluno) {...};
    public void remover (Aluno aluno) {...};
}

O método adicionar e remover serve para colocar e retirar um aluno numa turma. Vamos supor que existem regras para isso (a turma não pode estar com as aulas em curso, por exemplo).

Seria incorreto fazer um método assim:
public List<Aluno> getAlunos() {
   return alunos;
}

Isso pq um usuário que usasse a sua classe, poderia remover alunos diretamente da lista, e não pelo método remover. Ou adicionar, sem usar o método adicionar. Bastaria ele fazer:

//Ops removeu da turma sem qualquer verificação! Falha do encapsulamento!
turma.getAlunos().remove(aluno);
ou
//Ops adicionou na turma sem qualquer verificação! Falha do encapsulamento!
turma.getAlunos().add(aluno);

Mas um método getAlunos() é interessante. Você pode querer iterar sobre os alunos da turma. Ou pode querer passar os alunos para um método de impressão, que receba uma collection qualquer. Como esse:

public void imprime(Collection<?> items) {
   for (Object item : items) {  
       System.out.println(item.toString());
   }
}
Como resolver esse problema? Uma das alternativas seria retornar uma cópia da lista de alunos:
public class Turma {
   ...
   public List<Aluno> getAlunos() {
      return new ArrayList<Aluno>(alunos);
   }
}
Assim, se o usuário fizer:
turma.getAlunos().remove(aluno);
Vai remover da cópia e não da turma. A outra, seria usar o método Collections.unmodifiableList:
public class Turma {
   ...
   public List<Aluno> getAlunos() {
      return Collections.unmodifiableList(alunos);
   }
}
Assim, se o usuário fizer:
turma.getAlunos().remove(aluno);

Vai recer uma UnsupportedOperationException. Isso também inclui remoção usando o iterator.

Criado 23 de outubro de 2007
Ultima resposta 23 de out. de 2007
Respostas 2
Participantes 3