【问题标题】:How to achieve lateinit effect for primitive types?如何实现原始类型的lateinit效果?
【发布时间】:2021-06-11 06:34:03
【问题描述】:

我读过Why doesn't Kotlin allow to use lateinit with primitive types?

不过,使用lateinit有一个好处,就是如果错误是没有初始化导致的,可以从错误信息中立即知道。但是对于不能使用lateinit的基元类型,比如Int,用户必须赋值0。但是如果合适的值应该是一个远大于0的值,必须稍后确定,然后,用户忘记初始化值,程序稍后产生错误,有什么办法让看到错误信息的用户立即意识到错误不是由其他原因引起的

非常感谢。

lateinit var v:Int? = null很糟糕,这使得v--这样的操作变得非常复杂。

【问题讨论】:

  • "使v-- 之类的操作变得非常复杂。"不,它没有。只需执行v!!.dec(),如果您尝试访问未初始化的属性,就会得到一个异常(就像您对lateinit 执行的操作一样,但不是同一个异常)。
  • @Sweeper 感谢您的回答,但似乎-- 不等于.dec()pl.kotl.in/QOwpjZCpt
  • 引用类型对于“未设置”有一个非常明显且明确的值:null。对于原语来说,情况并非如此。 (零很可能是一个有效值。可能是-1,或-9999,甚至是MIN_VALUE,或MAX_VALUE......那么其他原始类型呢?占位符字符是什么?还是布尔值?无论你选择哪个值,有人在某些时候会需要它。或者你有一个特定于实例的占位符,这比包装器还要复杂。)

标签: kotlin


【解决方案1】:

您链接的答案解释了为什么在技术上不可能支持原始类型的lateinit。因此,即使拥有它们有好处,那么......好吧,见上文,这在技术上是不可能的。

您可以使用属性委托获得非常相似的效果:

var v by Delegates.notNull<Int>()

【讨论】:

  • 感谢您的回答,但它会使v-- 无法使用,但这可能是最好的答案?奥兹
  • 嗯,为什么无法使用?我对此进行了测试,v----v 似乎都按预期工作。 @ltoibq93578
  • 当kotlin的版本为1.3.72时会导致CompilationException。但 1.5 不会。
猜你喜欢
  • 2020-02-25
  • 1970-01-01
  • 2019-05-11
  • 2011-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
相关资源
最近更新 更多