Pergunta

Eu estou procurando alguma maneira eficiente para a construção de uma classe imutável, assim como classe String do Java.

Foi útil?

Solução

  1. Todos os campos devem ser private e de preferência final
  2. Certifique-se a classe não pode ser substituído - tornar a classe final, ou usar fábricas estáticas e mantê construtores private
  3. Os campos devem ser preenchidos a partir do Construtor / Fábrica
  4. não fornecem qualquer setters para o campos
  5. Cuidado com as coleções. Usar Collections.unmodifiable*. Além disso, coleções deve conter objectos só imutáveis ??
  6. Todas as getters deve fornecer objetos imutáveis ??ou uso cópia defensiva
  7. 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top