Kotlin 不允许这样做:
private lateinit var port: Int;
Run Code Online (Sandbox Code Playgroud)
我可以使用什么来将类似整数的值标记为允许延迟初始化?
我明白为什么这不起作用(Int 是原始的),我需要知道该使用什么?
编辑1
它不是这个的重复,因为我想知道在这种情况下使用什么,而不是为什么会发生:Why does not Kotlin allowed to use Lateinit with Primitive types?
编辑 2 正如下面@Roland 所建议的 - BitInteger 对我有用:
private lateinit var port: BigInteger;
Run Code Online (Sandbox Code Playgroud)
我只是用它来生成一个 URL,所以我实际上只需要在字符串连接中使用它。
我想到了一些变体,但取决于您以后如何使用它,可能没有一个适合您。
只需使用默认值,例如:
var port : Int = 8080
Run Code Online (Sandbox Code Playgroud)使用其他Number类型代替Int,例如
class Server {
lateinit var port : Number
}
Run Code Online (Sandbox Code Playgroud)
port.toInt()如果需要,您可以致电。但是:有很多Number- 类型,因此将其缩小到 例如BigInteger可能是有意义的。否则你可能会得到一些你一开始就不想接受的东西。
使用Delegates.notNull
var port : Int by Delegates.notNull()
Run Code Online (Sandbox Code Playgroud)
但是:即使你保留了null-value,你也无法检查变量是否已被初始化,所以你只需要在想要访问它时立即处理异常......我认为不太好...... .但如果你确定你得到了一个值,那么这对你来说也可能没问题。
只需使用Int?并跳过lateinit,例如:
class Server {
var port : Int? = null
}
Run Code Online (Sandbox Code Playgroud)
而不是::port.isInitialized你会要求port != null,但是:你现在需要处理可能的null- 值,但这?不应该是一个大问题。
如果您在获得第一个值后不想接受-values,请使用Int?with ,使其基本上类似于;-)Delegates.vetoablenulllateinit
class Server {
var port : Int? by Delegates.vetoable(null as Int?) {
_, _, newValue -> newValue != null
}
}
Run Code Online (Sandbox Code Playgroud)
并使用再次检查port != null,现在的行为类似于::port.isInitialized
并不是说我是最后两个的忠实粉丝,因为他们null再次介绍了,但根据你所做的,这可能完全没问题......
当您添加了有关String串联的内容时,我更愿意Int?在这里使用。然后你仍然可以使用类似的东西:
url = "$host${port?.let { ":$it" }?:""}"
// or:
url = port?.let { "$host:$it" } ?: host
// or
url = listOfNotNull(host, port).joinToString(":")
Run Code Online (Sandbox Code Playgroud)
使用 ? 同样的事情真的不能更容易吗::port.isInitialized?
我不知道您正在寻找的完美解决方案,但我这样做(如果您实际上被迫使用原始类型):
class Example{
private var _port: Int? = null
var port:Int
get() = this._port!!
set(i) { _port = i }
}
Run Code Online (Sandbox Code Playgroud)
至少这允许您使用该属性,就好像该属性不可为空一样。迄今为止我们找到的最佳解决方案!
| 归档时间: |
|
| 查看次数: |
3247 次 |
| 最近记录: |