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)
注意声明savedStateMessage为String?(可空字符串)和使用?.(null安全调用).这些是必需的,因为编译器不能保证onCreate()以前会调用它onButtonClickedPrintMessageLength().作为开发人员,我们知道onCreate将始终首先调用* **.
我的问题是如何告诉编译器这些方法的保证顺序并消除空检查行为?
*我认为可以直接new启动ExampleActivity和调用onButtonClickedPrintMessageLength(),从而避开Android框架和生命周期方法,但编译器/ JVM可能会在发生任何有趣的事情之前遇到错误.
**onCreate首先调用的保证由Android框架提供,这是一个外部事实来源,未来可能会有不同的破坏/功能.虽然看到所有Android应用程序都基于这一事实来源,但我相信信任是安全的.
虽然这不能回答你的实际问题,但在Kotlin中你可以lateinit用来告诉编译器你将var在以后的某个时间初始化a :
lateinit var savedStateMessage: String
UninitializedPropertyAccessException如果您在初始化之前尝试使用此变量,那么您将获得非常具体的信息.此功能在JUnit等用例中非常有用,在这些用例中,您通常会在@Before-annotated方法和Android中初始化变量,在这种情况下Activity,您无权访问构造函数并初始化内容onCreate().
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |