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.