2009-10-10 9 views
11

Estoy escribiendo una función equals(Object obj) para una clase. Veo que es posible acceder a los campos privados de obj de la persona que llama. Así que en lugar de utilizar un captador:Java: Acceso a campos privados directamente desde otra instancia de la misma clase

Odp other = (Odp) obj; 
if (! other.getCollection().contains(ftw)) { 

} 

sólo puedo acceder al campo directamente:

Odp other = (Odp) obj; 
if (! other.collection.contains(ftw)) { 

} 

¿Es esta mala práctica?

+1

puede no ser una copia exacta, pero muy cerca: http://stackoverflow.com/questions/1540159/using-getters-or -using-direct-field-access-within-a-pojo – ChssPly76

Respuesta

6

No, no lo es. La razón por la cual las variables y métodos privados no son accesibles desde otras clases es permitirle cambiar las partes internas de su clase sin tener que cambiar todo el código que usa la clase (eso y para evitar que el usuario de su clase, por ejemplo, establezca una variable a un valor que nunca se supone que debe tener).

Si utiliza variables privadas de otros objetos que no duele nada, porque si lo desea reestructurar partes internas de su clase, que tendría que cambiar el código dentro de la clase de todos modos.

+1

El hecho de que funcione el 99% del tiempo no significa que sea lo correcto. Rompe la encapsulación y combina las clases más estrictamente sin otro motivo que guardar escribiendo cinco caracteres. Por favor mira mi respuesta. –

+3

"une las clases más juntas" - ¿qué clases? Aquí solo hay una clase relacionada, y no se puede "desacoplar" una clase de sí mismo. – sepp2k

+1

No necesariamente. El parámetro pasado a igual() no es necesariamente la misma clase exacta. –

9

Tiendo a utilizar getters siempre, porque a veces un getter no es solo "return (foo)". A veces inicializan cosas si son nulas, o tienen algún registro de depuración en ellas, o validan el estado actual de alguna manera. Es más consistente.

+0

+1 Si por alguna razón "colección" puede ser ren Amedio de un estado más claro de su propósito, preferiría cambiarlo en un lugar en lugar de en cualquier lugar donde se hubiera usado el captador. –

1

Eso está bien y es completamente normal. Es un poco extraño pensar que this puede jugar con los campos privados de other, pero está bien, porque no hay manera de que nada malo puede suceder por lo que un tercero ser capaz de lodo con las partes internas de un objeto Odp. Cualquier método de la clase Odp puede modificar cualquier miembro privado de cualquier objeto Odp, incluso los que no sean this, ¡pero está bien ya que obviamente se puede confiar en tales métodos!

5

No creo que esto sea una mala práctica, sino una característica del lenguaje. No solo le permite probar equals de la forma en que lo hace, sino que también es útil en un patrón Prototipo para la creación de objetos.

0

El uso de miembro privado para la clase de entidad puede causar que la clase de proxy funcione incorrectamente. Imagine hibernate create class por consulta perezosa. Si marca la variable miembro, devuelve nulo. Pero si llama a get(), obtendrá datos de la base de datos e inicializará el campo.

Cuestiones relacionadas