concepts language-agnostic oop encapsulation

language-agnostic - oop concepts



¿Puedes explicar esto sobre la encapsulación? (3)

En respuesta a ¿Cuál es su suposición de programación más antigua que resultó ser incorrecta? Pregunta, uno de los supuestos erróneos fue:

Las variables miembros privadas eran privadas para la instancia y no para la clase.

( Link )

No pude captar de qué está hablando. ¿Alguien puede explicar qué es lo incorrecto / correcto sobre eso con un ejemplo?


Aquí está el equivalente de la respuesta de Michael Borgwardt para cuando no puede acceder a los campos privados del otro objeto:

public class MutableInteger { private int value; // Lots of stuff goes here public boolean equals(Object o) { if(!(o instanceof MutableInteger)){ return false; } MutableInteger other = (MutableInteger) o; return other.valueEquals(this.value); // <------------ } @Override // This method would probably also be declared in an interface public boolean valueEquals(int oValue) { return this.value == oValue; } }

Hoy en día esto es familiar para los programadores de Ruby, pero he estado haciendo esto en Java por un tiempo. Prefiero no confiar en el acceso a los campos privados de otro objeto. Recuerde que el otro objeto puede pertenecer a una subclase, que podría almacenar el valor en un campo de objeto diferente, o en un archivo o base de datos, etc.


Código de ejemplo (Java):

public class MutableInteger { private int value; // Lots of stuff goes here public boolean equals(Object o) { if(!(o instanceof MutableInteger)){ return false; } MutableInteger other = (MutableInteger) o; return this.value == other.value; // <------------ } }

Si el supuesto "las variables de miembro privado son privadas para la instancia" fuera correcto, la línea marcada causaría un error del compilador, porque el campo other.value es privado y parte de un objeto diferente al que se llama al método equals() .

Pero como en Java (y en la mayoría de los otros lenguajes que tienen el concepto de visibilidad) private visibilidad private es por clase, se permite el acceso al campo a todo el código del MutableInteger , sin MutableInteger qué instancia se usó para invocarlo.


public class Example { private int a; public int getOtherA(Example other) { return other.a; } }

Me gusta esto. Como puede ver privado, no protege al miembro de la instancia para que no pueda acceder a otra instancia.

Por cierto, esto no es tan malo siempre y cuando seas un poco cuidadoso. Si privado no funcionara como en el ejemplo anterior, sería engorroso escribir equals () y otros métodos similares.