科特林!!运算符使用使代码不清晰
Kotlin !! Operator usage makes code not clear
我正在编写一个 Kotlin 应用程序,我已经研究了这种语言一点点,我注意到要创建一个变量,您必须明确定义它是否可以为空,然后使用 ?运算符。
现在,我的问题。有时我必须定义一个全局变量(在这种情况下是一个片段),所以我需要将它设为空,因为我还不能初始化它
在 java 中,我没有遇到这个问题,因为在声明它之后我做的第一件事就是像这样在 onCreate() 中初始化
TurboFragment fragment = null;
@Override
public void onCreate(Bundle savedInstanceState) {
...
fragment = adapter.getCurrentFragment();
}
然后我就可以毫无语法问题地使用它了
在 Kotlin 中是不同的,因为我必须那样做
private var fragment: TurboFragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
...
fragment = adapter!!.currentFragment
fragment!!.foo()
var x = fragment!!.sampleInt
}
现在,每次调用片段实例时,我都必须使用空安全 !! 运算符。这让我的代码变得一团糟,因为每一行我至少有一个!运算符,它是否如此频繁看起来真的不清楚,特别是如果你有 5 个或更多这样的变量。
有没有办法简化代码或者这种语言的本质就是这样?
考虑使用 Late-Initialized Properties。它们适用于您的 use-case.
private lateinit var fragment: TurboFragment
但是,您应该记住,在初始化 lateinit
属性 之前访问它会引发异常。这意味着只有在您完全确定它们 将 被初始化时才应该使用它们。
print(fragment) // UninitializedPropertyAccessException is thrown
我正在编写一个 Kotlin 应用程序,我已经研究了这种语言一点点,我注意到要创建一个变量,您必须明确定义它是否可以为空,然后使用 ?运算符。
现在,我的问题。有时我必须定义一个全局变量(在这种情况下是一个片段),所以我需要将它设为空,因为我还不能初始化它
在 java 中,我没有遇到这个问题,因为在声明它之后我做的第一件事就是像这样在 onCreate() 中初始化
TurboFragment fragment = null;
@Override
public void onCreate(Bundle savedInstanceState) {
...
fragment = adapter.getCurrentFragment();
}
然后我就可以毫无语法问题地使用它了 在 Kotlin 中是不同的,因为我必须那样做
private var fragment: TurboFragment? = null
override fun onCreate(savedInstanceState: Bundle?) {
...
fragment = adapter!!.currentFragment
fragment!!.foo()
var x = fragment!!.sampleInt
}
现在,每次调用片段实例时,我都必须使用空安全 !! 运算符。这让我的代码变得一团糟,因为每一行我至少有一个!运算符,它是否如此频繁看起来真的不清楚,特别是如果你有 5 个或更多这样的变量。 有没有办法简化代码或者这种语言的本质就是这样?
考虑使用 Late-Initialized Properties。它们适用于您的 use-case.
private lateinit var fragment: TurboFragment
但是,您应该记住,在初始化 lateinit
属性 之前访问它会引发异常。这意味着只有在您完全确定它们 将 被初始化时才应该使用它们。
print(fragment) // UninitializedPropertyAccessException is thrown