Pregunta

Estoy buscando una forma eficiente de construir una clase inmutable, al igual que la clase String de Java.

¿Fue útil?

Solución

  1. Todos los campos deben ser privado y preferiblemente final
  2. Asegúrese de que la clase no pueda ser anulado - hacer la clase final, o usar fábricas estáticas y mantener constructores privados
  3. Los campos deben rellenarse desde Constructor / Fábrica
  4. No proporcione ningún setter para el campos
  5. Cuidado con las colecciones. Utilizar Collections.unmodifiable * . Además, las colecciones deben contener solo objetos inmutables
  6. Todos los captadores deben proporcionar objetos inmutables o use copia defensiva
  7. No proporcione ningún método que cambiar el estado interno de la Objeto.

Tom Hawtin señaló que final puede ser opcional. String class tiene un caché hash var que solo se asigna cuando se llama a la función hash.

Otros consejos

Si completa todos los campos con el constructor y hace que los campos sean finales, estará a medio camino allí.

Si los campos usan tipos personalizados, es posible que también necesite hacerlos inmutables.

Los campos que son colecciones deben usar las colecciones no modificables, para estar seguros.

¡Debe preocuparse por el gráfico del objeto!

Cualquier método en el objeto debe tener cuidado con los campos no finales. P.ej. String.add crea una nueva cadena. Si necesita mutar un campo, hágalo a través de un constructor de copias.

Finalmente haz que el objeto sea final.

Un objeto es inmutable si ninguno de sus campos puede modificarse, por lo que esos campos deben ser final . Si no desea que su objeto se subclasifique, también puede hacer que la clase en sí misma sea final , tal como lo es String. Para construir fácilmente un objeto inmutable con mucha información, debe mirar el Patrón de fábrica

Para obtener más información, consulte Wikipedia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top