Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Retornando um objeto imutável

Na aula sobre Collections, o Paulo comenta sobre o método unmodifiableList(), responsável por garantir a consistência do encapsulamento da classe. Mas uma dúvida que me surgiu é que o método unmodifiableList é somente para Lists, assim sendo, existe um método ou uma boa prática que irá garantir a consistência caso eu retorne uma referência de um objeto desenvolvido por mim ?

1 resposta
solução!

Oi Bruno! Tudo bem?

Para retornar um objeto que não pode ser mais modificado, você pode usar a palavra chave final nos atributos desse objeto. Ao fazer isso, o próprio compilador não irá deixar você nem fazer um setter usando aquele atributo. Tente usar esse exemplo:

public class MeuObjeto {
    private final int valor;
    private final String nome;

    public MeuObjeto(int valor, String nome) {
        this.valor = valor;
        this.nome = nome;
    }

    public int getValor() {
        return valor;
    }

    public String getNome() {
        return nome;
    }

    public void setValor(int valor){
        this.valor = valor;
    }

    public void setNome(String nome){
        this.nome = nome;
    }

}

É mais ou menos assim que a implementação da unmodifiableList() funciona por baixo dos panos: todos os métodos da List que poderiam modificá-la, ao serem sobrescritos, retornam uma exceção dizendo que a lista não pode ser modificada:

static class UnmodifiableList<E> extends UnmodifiableCollection<E>
                                  implements List<E> {
        private static final long serialVersionUID = -283967356065247728L;
        final List<? extends E> list;

        UnmodifiableList(List<? extends E> list) {
            super(list);
            this.list = list;
        }

        public boolean equals(Object o) {return o == this || list.equals(o);}
        public int hashCode()           {return list.hashCode();}

        public E get(int index) {return list.get(index);}
        public E set(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public void add(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public E remove(int index) {
            throw new UnsupportedOperationException();
        }
        public int indexOf(Object o)            {return list.indexOf(o);}
        public int lastIndexOf(Object o)        {return list.lastIndexOf(o);}
        public boolean addAll(int index, Collection<? extends E> c) {
            throw new UnsupportedOperationException();
        }
        public ListIterator<E> listIterator()   {return listIterator(0);}

Porém, no nosso caso, ao invés de retornar uma exceção, o programa nem compila ao tentarmos alterar o objeto.

A ideia principal é essa. Espero ter ajudado!

Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!