En Scala veo una característica como variable privada de objeto. Desde mi experiencia en Java no muy rica, aprendí a cerrar todo (hacerlo privado) y abrirlo (proporcionar accesores) si es necesario. Scala introduce un modificador de acceso aún más estricto. ¿Debería usarlo siempre por defecto? ¿O debería usarlo solo en algunos casos específicos en los que necesito restringir explícitamente el cambio de valor de campo incluso para objetos de la misma clase? En otras palabras, ¿cómo debo elegir entre
class Dummy {
private var name = "default name"
}
class Dummy {
private[this] var name = "default name"
}
El segundo es más estricto y me gusta, pero ¿debería usarlo siempre o solo si tengo una razón de peso?
EDITADO: Como veo aquí, private[this]
es solo un subcaso y en lugar de this
puedo usar otros modificadores: "paquete, clase u objeto único". Así que lo dejaré para algún caso especial.
Solución del problema
En la mayoría de los lenguajes de programación OOP como Java, los campos/métodos privados significan que estos campos/métodos privados no son accesibles fuera de la clase. Sin embargo, las instancias/objetos de la misma clase pueden tener acceso a los campos privados de los objetos mediante el operador de asignación o mediante el constructor de copias. En Scala, private[this] es un objeto privado, lo que garantiza que cualquier otro objeto de la misma clase no pueda acceder a los miembros de private[this].
Ejemplo
1.Sin privado[esto]
object ObjectPrivateDemo {
def main(args: Array[String]) {
var real = new User("realUserName", "realPassword")
var guest = new User("dummyUserName", "dummyPassword")
real.displayUser(guest)
}
}
class User(val username:String,val password:String) {
private var _username=username
private var _password=password
def displayUser(guest:User){
println(" guest username="+guest._username+" guest password="+guest._password)
guest._username= this._username
guest._password= this._password
println(" guest username="+guest._username+" guest password="+guest._password)
}
}
2.Usando privado[esto]
class User(val username: String, val password: String) {
private var _username = username
private[this] var _password = password
def displayUser(guest: User) {
println(this._username)
println(this._password)
guest._username = this._username
// for guest._password it will give this:error value _password is not member of class User
guest._password = this._password
}
}
Por lo tanto, private[this] se asegura de que el campo _password solo sea accesible con this.
No hay comentarios:
Publicar un comentario