De una cita que leí en línea :
Una de las reglas de Swift es que debe inicializar todas las propiedades de una clase antes de inicializar la superclase. Esto evita los problemas que pueden surgir si un superinicializador llama a un método que se anula y genera un estado incoherente.
Entonces, ¿parece que hay algún paradigma de programación detrás de esta declaración? Como estoy usando Java y no existe tal restricción en Java, quiero saber cómo Java resuelve este problema.
En Java, el superconstructor se ejecuta antes que el constructor de la subclase, todo lo contrario de lo que sucede en Swift. Y no hay nada que le impida llamar a un método anulado en el constructor de la superclase, pero eso no significa que deba hacerlo. Vea esta pregunta relacionada:
¿Por qué los métodos invocados en el constructor de clases deberían ser definitivos?
Básicamente, cuando llama a un método anulado, existe la posibilidad de que esté accediendo a campos no inicializados, o simplemente no haga lo que la superclase espera en general.
Sin embargo, hay usos legítimos de esto:
En Java, ¿hay una razón legítima para llamar a un método no final desde un constructor de clase?
En Swift, el inicializador de superclase puede llamar a métodos anulados sin problemas (siempre que todas las propiedades almacenadas estén inicializadas), porque en ese momento, las propiedades de toda la jerarquía de clases están completamente inicializadas.
Hay herramientas como SonarQube que detectan problemas como estos, pero por lo demás el compilador de Java no lo hace. Si pregunta por qué, bueno, es toda esa compensación de "control versus seguridad": ¿quiere un control más detallado sobre su código o más seguridad?