静态类型语言中的生命周期方法

cod*_*ehl 0 android functional-programming ios kotlin swift

在过去的一年里,我成为了移动开发人员和功能编程崇拜者.

在每个移动领域中,都有具有生命周期方法的组件构成了应用程序的核心.以下将使用Android和Kotlin作为示例,但同样适用于iOS和Swift.

在Android中,有Activity像生命周期的方法onCreate().您还可以定义一个函数,onButtonClicked()它将完全按照名称描述的那样执行.

出于问题的目的,假设有一个定义的变量onCreate()用于按钮单击处理程序onButtonClickedPrintMessageLength()(通常是这种情况 - onCreate()基本上Activity是设置方法).

示例类看起来像这样:

class ExampleActivity: Activity() {
    var savedStateMessage: String? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        savedStateMessage = "Hello World!"
    }

    fun onButtonClickedPrintMessageLength() {
        System.out.println(savedStateMessage?.length)
    }
}
Run Code Online (Sandbox Code Playgroud)

注意声明savedStateMessageString?(可空字符串)和使用?.(null安全调用).这些是必需的,因为编译器不能保证onCreate()以前会调用它onButtonClickedPrintMessageLength().作为开发人员,我们知道onCreate将始终首先调用* **.

我的问题是如何告诉编译器这些方法的保证顺序并消除空检查行为?

*我认为可以直接new启动ExampleActivity和调用onButtonClickedPrintMessageLength(),从而避开Android框架和生命周期方法,但编译器/ JVM可能会在发生任何有趣的事情之前遇到错误.

**onCreate首先调用的保证由Android框架提供,这是一个外部事实来源,未来可能会有不同的破坏/功能.虽然看到所有Android应用程序都基于这一事实来源,但我相信信任是安全的.

Ego*_*gor 6

虽然这不能回答你的实际问题,但在Kotlin中你可以lateinit用来告诉编译器你将var在以后的某个时间初始化a :

lateinit var savedStateMessage: String

UninitializedPropertyAccessException如果您在初始化之前尝试使用此变量,那么您将获得非常具体的信息.此功能在JUnit等用例中非常有用,在这些用例中,您通常会在@Before-annotated方法和Android中初始化变量,在这种情况下Activity,您无权访问构造函数并初始化内容onCreate().