我在网上看到的一句话:swift的规则之一是,在初始化超类之前,必须初始化类的所有属性。这样可以避免超级初始化器调用被重写的方法时可能出现的问题,从而导致状态不一致。所以这句话背后似乎有某种编程范式?因为我使用的是java,而且java中没有这样的限制,所以我想知道java是如何解决这个问题的。
nvbavucw1#
在java中,超级构造函数在子类构造函数之前运行,这与swift中的情况完全相反。没有什么可以阻止您在超类构造函数中调用重写的方法,但这并不意味着您应该这样做。请参阅此相关问题:为什么类构造函数上调用的方法应该是final?基本上,当您调用一个重写的方法时,有一种可能是您正在访问未初始化的字段,或者只是没有执行超类通常所期望的操作。不过,这种用法是合法的:在java中,从类构造函数调用非final方法是否有正当理由?在swift中,超类初始化器可以毫无问题地调用重写的方法(只要所有存储的属性都已初始化),因为到那时,整个类层次结构的属性都已完全初始化。有些像sonarqube这样的工具可以处理这样的问题,但是java编译器不会这样做。如果你问为什么,那么,这是整个“控制与安全”的权衡-你想要对你的代码进行更细粒度的控制,还是更安全?
1条答案
按热度按时间nvbavucw1#
在java中,超级构造函数在子类构造函数之前运行,这与swift中的情况完全相反。没有什么可以阻止您在超类构造函数中调用重写的方法,但这并不意味着您应该这样做。请参阅此相关问题:
为什么类构造函数上调用的方法应该是final?
基本上,当您调用一个重写的方法时,有一种可能是您正在访问未初始化的字段,或者只是没有执行超类通常所期望的操作。
不过,这种用法是合法的:
在java中,从类构造函数调用非final方法是否有正当理由?
在swift中,超类初始化器可以毫无问题地调用重写的方法(只要所有存储的属性都已初始化),因为到那时,整个类层次结构的属性都已完全初始化。
有些像sonarqube这样的工具可以处理这样的问题,但是java编译器不会这样做。如果你问为什么,那么,这是整个“控制与安全”的权衡-你想要对你的代码进行更细粒度的控制,还是更安全?