¿Por qué al crear una clase inmutable, los campos se declaran privados?

Al crear una clase inmutable, todos los campos se declaran como definitivos, de modo que su valor no puede modificarse. Esto está bien, pero ¿por qué también los declaramos privados?

Si el campo es una referencia a un objeto mutable, hacerlo final evitará que la referencia rebote a un objeto diferente. Sin embargo, el objeto todavía se puede modificar, en efecto, la inmutabilidad del objeto que lo contiene es lateral.

Para evitar esto, puede hacer que el campo sea private (si no pueden verlo, no pueden modificarlo).

Por ejemplo:

 public class Order { public final List order_lines = ...; } 

Aquí, cualquiera puede order_lines y modificar el pedido agregando / eliminando / modificando líneas de pedido, incluso aunque order_lines sea final .

Un objeto inmutable no puede cambiar después de ser creado, pero eso no significa que necesariamente tenga una implementación simple que se deba exportar a todos los clientes. Como ejemplo, tome el tipo String , que utiliza muchas optimizaciones locas detrás de escena para maximizar la eficiencia en casos comunes (por ejemplo, compartir una matriz de respaldo cuando se utiliza la substring ). Al ocultar todos los campos de la clase, la implementación puede intentar aprovechar las optimizaciones que ahorran tiempo o espacio y mediar el acceso a los datos almacenados a través de la interfaz pública. Si esos campos fueran públicos, sería difícil (si no imposible) cambiar la implementación después del hecho.

En otras palabras, la inmutabilidad no implica encapsulación o viceversa.

¡Espero que esto ayude!

 public class Person{ public Date birthDate = new Date(615666470l); } 

Entonces cualquier persona podría tener la fecha de nacimiento actualizada desde el exterior.

 Person porfiriopartida = new Person(); porfiriopartida.birthDate=new Date(931199270); 

Si proporciona un constructor con los atributos iniciales necesarios y luego solo permite obtener referencias a los valores que funcionarán.

Además, recuerde que no debe devolver el objeto real en los métodos de obtención (al menos que sean inmutables).