根据我在线阅读的报价:
Swift的规则之一是,必须在初始化超类之前初始化一个类的所有属性。这避免了如果超级初始化程序调用被覆盖而导致状态不一致的方法时可能出现的问题。
如此看来,该语句后面似乎有一些编程范例?由于我正在使用Java,并且Java中没有此类限制,因此我想知道Java如何解决此问题。
在Java中,超级构造函数在子类构造函数之前运行-与Swift中发生的情况完全相反。没有什么可以阻止您在超类构造函数中调用重写的方法,但这并不意味着您应该这样做。请参阅以下相关问题:
基本上,当您调用重写的方法时,有可能您正在访问未初始化的字段,或者根本不执行超类通常期望的操作。
虽然有合法用法:
在Java中,是否有合理的理由从类构造函数中调用非最终方法?
在Swift中,超类初始化器可以毫无问题地调用重写的方法(只要所有存储的属性都已初始化),因为到那时,整个类层次结构的属性已被完全初始化。
有诸如SonarQube之类的工具可以解决此类问题,但是Java编译器无法做到。如果您问为什么,那么,这就是整个“控制与安全”之间的折衷-您是否希望对代码进行更细粒度的控制,或者更安全?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句