【发布时间】:2016-09-04 21:41:51
【问题描述】:
在过去的一年里,我成为了一名移动开发人员和函数式编程的崇拜者。
在每个移动领域中,都有具有生命周期方法的组件构成了应用程序的核心。以下将以 Android 和 Kotlin 为例,但同样适用于 iOS 和 Swift。
在 Android 中,有 Activity 的生命周期方法,例如 onCreate()。您还可以定义一个函数onButtonClicked(),它的作用与名称所描述的完全一样。
出于问题的目的,假设在onCreate() 中定义了一个变量,用于按钮单击处理程序onButtonClickedPrintMessageLength()(通常是这种情况 - onCreate() 本质上是Activity' s 设置方法)。
示例类如下所示:
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)
}
}
注意savedStateMessage 声明为String?(可空字符串)和?.(空安全调用)的使用。这些是必需的,因为编译器不能保证onCreate() 将在onButtonClickedPrintMessageLength() 之前被调用。不过作为开发人员,we know that onCreate will always be called first* **。
我的问题是如何告诉编译器这些方法的保证顺序并消除空值检查行为?
* 我认为可以将new 升级到我们的ExampleActivity 并直接调用onButtonClickedPrintMessageLength(),从而避开Android 框架和生命周期方法,但编译器/JVM 可能会在任何有趣的事情发生之前遇到错误。
** 首先调用onCreate 的保证是由Android 框架提供的,它是一个外部事实来源,将来可能会以不同的方式中断/运行。不过,鉴于所有 Android 应用程序都基于此事实来源,我相信它是安全的。
【问题讨论】:
-
你不能告诉编译器方法的顺序,但你可以(在你的情况下)强制类型为
String并提供一个无用的默认值:var savedStateMessage: String = "default stupid value"。 -
您可能应该将此问题拆分为针对每种相关编程语言/环境的单独问题。如果你不这样做,那么你会遇到一个问题,即使只有一个可以被接受,但几个答案可能是正确的。
-
我同意你的看法,ColGraff。我应该把这个问题分成两个:一个是针对 Android 的,一个是针对 iOS 的。下次我只问一个,或者两个问题都问。
标签: android ios swift functional-programming kotlin