Collections.unmodifiableList!

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

[code] 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;
}[/code]

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!

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.

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:

[code]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) {...};

}[/code]

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&lt;Aluno&gt; 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&lt;?&gt; 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&lt;Aluno&gt; getAlunos() { return new ArrayList&lt;Aluno&gt;(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&lt;Aluno&gt; 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.