Por qué no usar el método # 2
Su segundo ejemplo no es recomendable porque si se ha añadido un nuevo campo a la clase de direcciones, a continuación, se puede añadir que en el método de selección existente o se crea una nuevo método setter? Si lo agrega al método setter existente, cualquier clase que invoque ese método se romperá.Y si creó un nuevo método setter, entonces es confuso para cualquiera que quiera usar esa clase por qué ciertos campos se agrupan de esa manera mientras que otros no.
El uso de un método de selección por separado para cada campo que desea exponer
La práctica común es tener un método de selección individual para cada campo en su clase que se desea exponer (es decir, el primer ejemplo) . Si esto es una buena práctica o no es discutible porque obliga a una clase a ser mutable. Lo mejor es hacer un objeto inmutable, si es posible, for a number of reasons.
Inicialización sus campos usando un constructor
Una manera de hacer una clase inmutable es mediante la eliminación de los métodos setter y en lugar de hacer sus campos configurables a través de su constructor de la clase, de la siguiente manera. La desventaja de implementarlo de esta manera es que si su clase tiene muchos campos, puede llevar a llamadas de constructor grandes e ilegibles.
public class Address {
public String name;
public String city;
private Address(String name, String city) {
this.name = name;
this.city = city;
}
}
Inicialización sus campos usando el Builder
A continuación se muestra una implementación alternativa completamente (inspirado en this article), que es una variación del patrón Builder. Simula la mutabilidad del objeto sin sacrificar la legibilidad.
public class Address {
public String name;
public String city;
private Address() {}
private void setName(String name) {
this.name = name;
}
private void setCity(String city) {
this.city = city;
}
static class Builder {
private Address address = new Address();
public Builder name(String name) {
address.setName(name);
return this;
}
public Builder city(String city) {
address.setCity(city);
return this;
}
public Address build() {
return address;
}
}
}
Con la clase anterior, se puede crear una instancia de la clase inmutable Dirección de la siguiente manera:
Address address = new Address.Builder()
.name("Mansoor's address")
.city("Toronto")
.build();
Qué enfoque utiliza más memoria?
Desde el punto de vista de la memoria, no debería haber ninguna diferencia ya que el tamaño de una clase en la memoria depende de los campos de la clase. Como las tres implementaciones tienen los mismos campos, deberían ocupar la misma cantidad de espacio en la memoria, independientemente del enfoque que utilice.
Muéstranos lo que quieres decir con ejemplos de código para ambos enfoques. –
¿Cuál es el propósito de esta clase? ¿es un objeto de valor? ¿requerirá establecer cada valor de forma independiente? ¿Estos valores tienen que cambiar después de la creación del objeto? ¿Qué quiere decir con "punto de vista de la memoria"? Memoria humana o memoria de la computadora? – buritos
primer ejemplo está bien, segundo ejemplo es malo. Usa un constructor – BalusC