2009-08-31 13 views
17

En respuesta a la pregunta What is your longest-held programming assumption that turned out to be incorrect?, una de las suposiciones erróneas fue:¿Puedes explicarme esto sobre la encapsulación?

que las variables miembro privadas eran privado a la instancia y no a la clase .

(Link)

no pude captar lo que está hablando, ¿alguien puede explicar lo que es el mal/razón en eso con un ejemplo?

+0

¿Cómo se relaciona esto con la encapsulación? – p4bl0

+6

visibilidad privada es cómo se implementa la encapsulación en lenguajes como Java, C++ y C# –

+1

@ p4bl0 ¿Cómo se relacionan el encapsulamiento y el ámbito variable? Bastante fundamentalmente. – meagar

Respuesta

35
public class Example { 
    private int a; 

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

Me gusta. Como puede ver, privado no protege al miembro de la instancia del acceso a otra instancia.

Por cierto, esto no es tan malo, siempre y cuando tenga un poco de cuidado. Si private no funciona como en el ejemplo anterior, sería engorroso escribir equals() y otros métodos similares.

+3

Para que los miembros privados sean privados para la clase y una instancia pueda acceder al miembro privado de otra instancia, ¿correcto? –

+0

Sí, eso es correcto. –

+0

OK, muchas gracias! –

2

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 "variables miembro privadas son privadas a la instancia" eran correctas, la línea marcada provocaría un error de compilación, porque el campo other.value es privada y parte de un objeto diferente al que se llama al método equals().

Pero como en Java (y la mayoría de los otros idiomas que tienen el concepto de visibilidad) private la visibilidad es por clase, el acceso al campo está permitido a todos los códigos MutableInteger, independientemente de qué instancia se utilizó para invocarlo.

+2

"y todos los demás lenguajes que tienen el concepto de visibilidad, creo" En ruby ​​private es por objeto. – sepp2k

+0

Gracias por la información, Michael. –

+0

En Scala puedes agregar el contexto: privado [esto] – egaga

3

Aquí es el equivalente de Michael Borgwardt's answer para cuando esté no acceder a los campos privados de 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 para Un rato. 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.

Cuestiones relacionadas