software - scala tutorial
En Scala, ¿qué es un "inicializador inicial"? (3)
En la reciente publicación de Martin Odersky sobre los niveles de capacidad de programador en Scala, en la sección Diseñador de biblioteca experta , incluye el término "inicializadores iniciales" .
Estos no se mencionan en Programación en Scala . ¿Qué son?
Los primeros inicializadores son parte del constructor de una subclase que debe ejecutarse antes de su superclase. Por ejemplo:
abstract class X {
val name: String
val size = name.size
}
class Y extends {
val name = "class Y"
} with X
Si el código fue escrito en su lugar como
class Z extends X {
val name = "class Z"
}
entonces se produciría una excepción de puntero nulo cuando Z
se inicializara, porque el size
se inicializa antes que el name
en el orden normal de inicialización (superclase antes de la clase).
Pensándolo bien, una capa de año ...
Esto es solo un pastel. Literalmente.
No es temprano NADA. Solo torta (mixins).
Cake es un término / patrón acuñado por el propio Grand Pooh-bah, que emplea el sistema de rasgos de Scala, que está a medio camino entre una clase y una interfaz. Es mucho mejor que el patrón de decoración de Java.
La llamada "interfaz" es simplemente una clase base sin nombre, y lo que solía ser la clase base está actuando como un rasgo (que francamente no sabía que se podía hacer). No está claro para mí si una clase "con '''' puede tomar argumentos (los rasgos no pueden), lo intentarán e informarán.
Esta pregunta y su respuesta han entrado en una de las mejores características de Scala. Lean sobre esto y estén maravillados.
Por lo que puedo decir, la motivación (como figura en el enlace de arriba) es:
"Naturalmente, cuando se invalida un val, no se inicializa más de una vez. Entonces, aunque x2 en el ejemplo anterior está aparentemente definido en cada punto, este no es el caso: un val invalidado aparecerá como nulo durante la construcción de superclases, como lo hará un val abstracto ".
No veo por qué esto es natural en absoluto. Es completamente posible que los rhs de una tarea puedan tener un efecto secundario. Tenga en cuenta que dicha estructura de código es completamente imposible en C ++ o Java (y adivinaré Smalltalk, aunque no puedo hablar en ese idioma). De hecho, tiene que hacer tales asignaciones duales implícitas ... ticilpmi ... Explícito en esos idiomas a través de constructores. A la luz de la incertidumbre de los efectos secundarios rhs, realmente no parece ser una gran motivación: la capacidad de eludir los efectos secundarios de las superclases (anulando así las invariantes de la superclase) a través de la ASIGNACIÓN. Ick!
¿Hay otras motivaciones "asesinas" para permitir una estructura de código tan insegura? Los lenguajes orientados a objetos han funcionado sin dicho mecanismo durante aproximadamente 40 años (30 años, si se cuenta desde la creación del idioma), ¿por qué incluirlo ahora?
Es ... solo ... parece ... peligroso.