跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • Kotlin 如何检测所有 lateinit 的 field 是否初始化
未分類
8 7 月 2020

Kotlin 如何检测所有 lateinit 的 field 是否初始化

Kotlin 如何检测所有 lateinit 的 field 是否初始化

資深大佬 : fanck0605 13

在 java 里,我一般用反射遍历所有 Field,并查看是否为 null

Example example = new Example();  // 这里解析一些文本并给 example 的成员变量赋值 // do something...  // 检测是否所有变量都被初始化 Field[] fields = Example.class.getFields() for (Field field : fields) {     try {      Object o = field.get(example);         if (o == null) {             throw new Exception();         }     } catch (IllegalAccessException ignored) {     } } 

kotlin 代码中,所有成员变量都用了 lateinit 修饰符, 那有没有类似的方法可以,检测所有变量是否被 initialized

大佬有話說 (6)

  • 資深大佬 : holmesabc

    this::wtf.isInitialized ??

  • 資深大佬 : dcalsky

    `isInitialized`

    给你写了一段,看图~

    https://sm.ms/image/P5VSfbmoh7XrJFg

  • 資深大佬 : aabbcc112233

    @holmesabc
    @dcalsky 审题,问的是判断所有变量。

    回复主:
    lateinit 的用法是很确定这个变量会在使用前被初始化。
    如果不确定,你应该使用可空类型来达到安全调用

  • 資深大佬 : john6lq

    @aabbcc112233 那就拿上方法遍历啊,你才是没“审题”的那个好吧,人家有这个需求你告诉他直接砍了而不是找解决办法。

  • 資深大佬 : flywith24

    为 Example 写个扩展函数,里面判断所有属性是否初始化,不知道是否满足你的需求

  • 主 資深大佬 : fanck0605

    我也是刚写 Kotlin,比较看中 Kotlin 的对空值的处理,还有协程。

    @aabbcc112233
    如果使用了可空类型,那么以后的调用都要加 `!!`,虽然可以从代码层面控制这些 成员变量 非空,但是这似乎让代码变得不够优雅了。

    @holmesabc @dcalsky
    这么写的确可以判断单个 成员变量 ,编译时,成员变量 也是固定的,一个一个判断也不是不可以。
    但成员变量很多时,写出来的代码似乎就会很冗长。

    现在我是这么写的,不知道有没有优化的余地。
    “`
    class Car {

    lateinit var field1: String
    lateinit var field2: String
    lateinit var field3: String
    lateinit var name: String
    lateinit var color: String

    // 这里还有很多成员变量

    companion object {
    val memberProperties = Car::class.memberProperties

    fun parse(text : String): Car {

    val car = Car()

    // 这里解析一些文本,并初始化 car 的成员变量
    // var car.field1 = xxx
    // var car.field2 = xxx
    // var car.field3 = xxx

    // 检测是否都被初始化
    for (memberProperty in memberProperties) {
    try {
    memberProperty.get(car)
    } catch (e: UninitializedPropertyAccessException) {
    // 抛出异常,保证外部获得的对象,所有变量都被 initialized
    throw Exception(“${memberProperty.name} is uninitialized! Failed to parse text: $text”)
    }
    }
    return car
    }
    }
    }
    “`

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具