Como sabemos, Scala genera getters y setters automáticamente para cualquier campo público y hace que la variable de campo real sea privada. ¿Por qué es mejor que hacer público el campo?¿Cuál es exactamente el punto de generar/captar generadores automáticamente para campos de objetos en Scala?
Respuesta
En primer lugar, esto permite intercambiar una var/val pública con un (par de) def (s) y aún mantener la compatibilidad binaria. En segundo lugar, permite anular una var/val en las clases derivadas.
Primero, mantener el campo público permite que un cliente lea y escriba el campo. Como es beneficioso tener objetos inmutables, recomendaría que el campo sea de solo lectura (lo que puedes lograr en Scala declarándolo como "val" en lugar de "var").
Ahora volvemos a su pregunta real. Scala le permite definir sus propios setters y getters si necesita más que las versiones triviales. Esto es útil para mantener invariantes. Para los instaladores, es posible que desee comprobar el valor en el que está establecido el campo. Si mantiene el campo público, no tiene posibilidad de hacerlo.
Esto también es útil para los campos declarados como "val". Supongamos que tiene un campo de tipo Array [X] para representar el estado interno de su clase. Un cliente ahora podría obtener una referencia a esta matriz y modificarla. De nuevo, no tiene posibilidad de garantizar que se mantenga la invariante. Pero dado que puede definir su propio getter, puede devolver una copia de la matriz real.
El mismo argumento se aplica cuando crea un campo de un tipo de referencia "público final" en Java: los clientes no pueden restablecer la referencia pero aún modificar el objeto al que apunta la referencia.
En una nota relacionada: acceder a un campo a través de captadores en Scala parece acceder al campo directamente. Lo bueno de esto es que permite hacer que acceder a un campo y llamar a un método sin parámetros en el objeto parezca lo mismo. Entonces, si decide que ya no quiere almacenar un valor en un campo, sino que lo calcula sobre la marcha, el cliente no tiene que preocuparse porque le parece lo mismo: esto se conoce como Uniform Access Principle
En resumen: el Principio de Acceso Uniforme.
Puede usar un valor val para implementar un método abstracto a partir de una superclase. Imagine la siguiente definición de algún paquete de gráficos imaginaria:
abstract class circle {
def bounds: Rectangle
def centre: Point
def radius: Double
}
Hay dos subclases posibles, uno donde el círculo se define en términos de un cuadro delimitador, y uno donde se define en términos del centro y el radio. Gracias a UAP, los detalles de la implementación se pueden abstraer por completo y cambiar fácilmente.
También hay una tercera posibilidad: lazy vals. Estos serían muy útiles para evitar volver a calcular los límites de nuestro círculo una y otra vez, pero es difícil imaginar cómo vagos se podrían implementar sin el principio de acceso uniforme.
- 1. control de scala 2.8 Excepción: ¿cuál es el punto?
- 2. ¿Cuál es el punto de especificar hibernate.jdbc.batch_size?
- 3. ¿Cuál es el punto de declarar estilo?
- 4. ¿Cuál es exactamente el punto del Atributo de EnablePartialRendering de ScriptManager
- 5. JABÓN - ¿Cuál es el punto?
- 6. HashMap.containsValue - ¿Cuál es el punto?
- 7. ¿Cuál es el punto de Mono en Windows
- 8. ¿Cuál es exactamente el Host Runtime?
- 9. ¿Cuál es el punto de aclocal?
- 10. ¿Cuál es el punto de os.error?
- 11. Propiedades de escritura, ¿cuál es el punto?
- 12. Javascript: ¿cuál es el punto de RegExp.compile()?
- 13. ¿Cuál es el punto de g ++ -Wreorder?
- 14. ¿Cuál es el punto de XPS?
- 15. ¿Cuál es el punto de setArguments?
- 16. ¿Cuál es el punto de Convert.ToDateTime (bool)?
- 17. ¿Cuál es el punto de MethodImplOptions.InternalCall?
- 18. ¿Cuál es el punto de FILL_AND_STROKE?
- 19. ¿Cuál es el punto de lazy-seq en clojure?
- 20. ¿Cuál es el punto en UrbanAirship?
- 21. ¿Cuál es el punto de setRetainsRegisteredObjects :?
- 22. ¿Cuál es el punto de System.IO.dll?
- 23. ¿Cuál es el punto de los punteros?
- 24. ¿Cuál es el punto de document.defaultView?
- 25. XNA: ¿Cuál es el punto de Descargar()?
- 26. ¿Cuál es el punto de DOCTYPE?
- 27. ¿Cuál es el punto de los frijoles?
- 28. ¿Cuál es el punto de make_heap?
- 29. ¿Cuál es el punto de STL?
- 30. ¿Cuál es el punto de _MERGE_PROXYSTUB?