Java如何解决Swift设计用来解决的类初始化问题?

Java如何解决Swift设计用来解决的类初始化问题?,java,swift,constructor,initialization,Java,Swift,Constructor,Initialization,我从一段引语中读到: Swift的规则之一是,在初始化超类之前,必须初始化类的所有属性。这避免了超级初始化器调用被重写的方法导致状态不一致时可能出现的问题 这句话的背后似乎有某种编程模式?因为我使用的是Java,Java中没有这样的限制,所以我想知道Java是如何解决这个问题的。在Java中,超级构造函数在子类构造函数之前运行,这与Swift中的情况完全相反。没有什么可以阻止您在超类构造函数中调用重写的方法,但这并不意味着您应该这样做。见这一相关问题: 基本上,当您调用一个重写的方法时,您可能

我从一段引语中读到:

Swift的规则之一是,在初始化超类之前,必须初始化类的所有属性。这避免了超级初始化器调用被重写的方法导致状态不一致时可能出现的问题


这句话的背后似乎有某种编程模式?因为我使用的是Java,Java中没有这样的限制,所以我想知道Java是如何解决这个问题的。

在Java中,超级构造函数在子类构造函数之前运行,这与Swift中的情况完全相反。没有什么可以阻止您在超类构造函数中调用重写的方法,但这并不意味着您应该这样做。见这一相关问题:

基本上,当您调用一个重写的方法时,您可能正在访问未初始化的字段,或者根本不做超类通常期望的事情

不过,这有其合法用途:

在Swift中,超类初始化器可以毫无问题地调用重写的方法(只要所有存储的属性都已初始化),因为到那时,整个类层次结构的属性已完全初始化


有这样的工具可以处理这样的问题,但Java编译器却不能做到这一点。如果你问为什么,好吧,这是整个“控制与安全”的权衡-你想要对代码进行更细粒度的控制,还是更安全?

据我所知,Java并不能解决这个问题,你只需要非常小心不要搞砸:)如果你试图在构造函数中调用非final方法,大多数Java IDE都会弹出警告,按照“警告:构造函数中可重写的方法调用”的思路说一些话。所以,是的,您必须小心,但是现代IDE可以帮助您。