Formas possíveis de fazer uma imutável Objeto
-
06-07-2019 - |
Pergunta
Eu estou procurando alguma maneira eficiente para a construção de uma classe imutável, assim como classe String do Java.
Solução
- Todos os campos devem ser
private
e de preferênciafinal
- Certifique-se a classe não pode ser substituído - tornar a classe final, ou usar fábricas estáticas e mantê construtores private
- Os campos devem ser preenchidos a partir do Construtor / Fábrica
- não fornecem qualquer setters para o campos
- Cuidado com as coleções. Usar
Collections.unmodifiable*
. Além disso, coleções deve conter objectos só imutáveis ?? - Todas as getters deve fornecer objetos imutáveis ??ou uso cópia defensiva
- não fornecem qualquer métodos que alterar o estado interno do Objeto.
Tom Hawtin apontou que final
pode ser opcional. String
class
tem um cache hash
var que só é atribuído quando a função hash é chamado.
Outras dicas
Se você preencher todos os campos usando o construtor e tornar os campos final -. Você está parcialmente lá
Se os campos usar tipos personalizados -. Pode ser necessário para torná-los imutáveis ??assim
Os campos que são coleções deve usar as coleções não-modificáveis ??-. Para estar no lado seguro
Você precisa se preocupar com o gráfico do objeto!
Qualquer métodos sobre a necessidade objeto para cuidar com campos não-finais. Por exemplo. String.add cria um new da cadeia. Se você precisa de se transformar um campo - fazê-lo através de um construtor de cópia
.Finalmente fazer o objeto final.
Um objeto é imutável, se nenhum de seus campos podem ser modificados, para que esses campos devem ser final
. Se você não quer que seu objeto a ser uma subclasse, você pode fazer a classe em si final
bem, assim como String é.
Para construir facilmente um objeto imutável com um monte de informações, você deve olhar para o padrão Fábrica
Para obter mais informações, consulte Wikipedia