El primero es un campo de solo lectura, mientras que el segundo se compila como un par de métodos (y todas las lecturas de la propiedad ProductLocation
se compilan en llamadas al método get
correspondiente y se compilan en llamadas al método set
; internamente, estos métodos leerán/escribirán en un campo interno, generado automáticamente, que no es de solo lectura). Diría que la diferencia más importante es la seguridad de hilos! (¿cómo? seguir leyendo!)
El uso básico de la clase se verá exactamente lo mismo: el código en otras clases solo podrá leer el valor, no cambiarlo. Además, el código para leer el valor se verá exactamente igual (por ejemplo, print(myInstace.ProductLocation)
; aquí no se puede decir cómo se ha declarado, genial, ¿eh?)
La primera y más trivial diferencia es que la propiedad con private setter permite instancias de la misma clase para modificar el valor, mientras que en el caso de la propiedad de solo lectura, ni siquiera el objeto en sí podrá cambiar el valor.
Ahora, para la seguridad de la rosca. El atributo readonly
en el campo cambiará su semántica de visibilidad de memoria cuando trabaje con varios subprocesos (al igual que los campos final
de Java).
Un campo readonly
solo se puede asignar a la declaración o en el constructor. El valor asignado a un campo readonly
no se puede cambiar (al menos no en una forma normal) y se garantiza que cada subproceso verá el valor inicializado correctamente después de que el constructor devuelva. Por lo tanto, un campo readonly
es intrínsecamente seguro para subprocesos.
Para lograr el mismo hilo de seguridad con la propiedad, tendría que agregar algo de sincronización en su código, que es propenso a errores. Puede llevar a bloqueos, carreras de datos o rendimiento reducido, dependiendo del caso, y especialmente si no tiene experiencia.
lo tanto, si el valor representa algo que semánticamente no se puede cambiar después de la construcción del objeto, no se debe declarar una incubadora privada (esto implicaría que el objeto podría cambiarlo). Vaya por el campo de solo lectura (y tal vez declare que es privado y declare una propiedad pública con solo un getter accediendo al campo! Esta es la forma preferida, ya que no es bueno exponer los campos, es mejor exponer solo los métodos; son muchas las razones que explican por qué en this answer)
Para mí, la diferencia más importante es la propiedad de inmutabilidad, ya que en realidad tiene algún valor semántico. – Freek