puedo añadir a una lista privada directamente a través del captador?

StackOverflow https://stackoverflow.com/questions/895257

  •  23-08-2019
  •  | 
  •  

Pregunta

Me doy cuenta de que voy a ser flameado por no simplemente escribir una prueba a mí mismo ... pero tengo curiosidad acerca de las opiniones de las personas, no sólo la funcionalidad, así que ... aquí va ...

Tengo una clase que tiene una lista privada. Quiero añadir a esa lista privada a través del método getMyList pública ().

así que ... es que esto funciona?

public class ObA{
 private List<String> foo;
public List<String> getFoo(){return foo;}
}

public class ObB{
   public void dealWithObAFoo(ObA obA){
     obA.getFoo().add("hello");

   }
}
¿Fue útil?

Solución

Sí, que absolutamente funciona - que suele ser una mala cosa. (Esto se debe a que realmente está devolviendo un referencia para el objeto de colección, no una copia de la propia colección.)

A menudo se desea proporcionar acceso de sólo lectura genuinamente a una colección, lo que normalmente significa el retorno de una envoltura de sólo lectura en torno a la colección. Haciendo que el tipo de retorno de una interfaz de sólo lectura implementado por la recogida y devolución de la colección de referencia actual no proporciona mucha protección: la persona que llama puede lanzar fácilmente al tipo de colección "real" y luego añadir sin ningún problema.

Otros consejos

De hecho, no es una buena idea. No publicar sus miembros mutables exterior, hacer una copia si no se puede proporcionar una versión de sólo lectura sobre la marcha ...

public class ObA{
  private List<String> foo;
  public List<String> getFoo(){return Collections.unmodifiableList(foo);}
  public void addString(String value) { foo.add(value); }
}

Si desea una opinión acerca de hacer esto, me quito la llamada getFoo() y añadir un add(String msg) y remove(String msg) métodos (o cualquier otra funcionalidad que desea exponer) a ObA

Dar acceso a la colección siempre parece ser algo malo en mi experiencia - en su mayoría, ya que son prácticamente imposibles de controlar una vez que salen. Me he tomado la costumbre de permitir NUNCA acceso directo a las colecciones fuera de la clase que los contiene.

El razonamiento principal detrás de esto es que casi siempre hay algún tipo de lógica de negocio unido a la recogida de datos - por ejemplo, la validación de adición o tal vez algún día se tendrá que añadir una segunda colección estrechamente relacionados.

Si permite el acceso como si estuviera hablando, será muy difícil en el futuro para hacer una modificación como esta.

Ah, también, a menudo encuentro que finalmente tiene que almacenar un poco más de datos con el objeto Estoy almacenando - por lo que se crea un nuevo objeto (sólo conocida dentro del "contenedor" que alberga la colección) y yo poner el objeto en el interior que antes de ponerlo en la colección.

Si usted ha mantenido su colección bloqueado, este es un refactor trivial. Trate de imaginar lo difícil que sería en algún caso se ha trabajado en donde no mantener la colección bloqueado ...

Si usted quiere apoyar a agregar y quitar funciones en Foo, sugeriría la addFoo métodos () y removeFoo (). Yo lo ideal es que podría eliminar la getFoo en conjunto mediante la creación de un método para cada pieza de funcionalidad que necesita. Esto hace que sea claro en cuanto a las funciones de una persona que llama preformas en la lista.

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