android - Kotlin !!运算符使用使代码不清晰

标签 android null kotlin kotlin-null-safety

我正在编写一个 Kotlin 应用程序,我已经研究了这种语言一点点,我注意到要创建一个变量,您必须显式定义它是否可以为空,然后使用 ?运营商。

现在,我的问题。有时我必须定义一个全局变量(在这种情况下是一个 Fragment),所以我需要将它设为 null,因为我还不能初始化它

在 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
}

现在,每次调用 fragment 实例时,我都必须使用空安全 !! 运算符。这让我的代码变得一团糟,因为每一行我至少有一个!运算符,它是否如此频繁看起来真的不清楚,特别是如果你有 5 个或更多这样的变量。 有没有办法简化代码或者这种语言的本质就是这样?

最佳答案

考虑使用 Late-Initialized Properties .它们适用于您的用例。

private lateinit var fragment: TurboFragment

但是,您应该记住,在初始化之前访问 lateinit 属性会引发异常。这意味着只有在您绝对确定它们被初始化时才应该使用它们。

print(fragment)  // UninitializedPropertyAccessException is thrown

关于android - Kotlin !!运算符使用使代码不清晰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49031447/

相关文章:

Android - 在 Activity 重新创建期间是否保留了 Intent ?

android - 打开街道 map 离线工作 android

java - Bufferedreader 永远不会为空,while 循环不会终止

kotlin - "lambda@"在 Kotlin 中是什么意思

mockito - 在 Kotlin 函数上使用 Mokito anyObject() 时,指定为非 null 的参数为 null

android - Android x86 是否模拟 ARM?

android - Android 中的动态标签

ruby-on-rails - Ruby - NoMethodError(nil 的未定义方法 :NilClass):

c# - 如何处理 byte[] 中的空值

java - 在不降低应用程序速度或崩溃的情况下将大尺寸照片放入小 ImageView 的问题