用于Lateinit Int值的Kotlin类型

时间:2019-03-07 15:51:18

标签: kotlin

科特琳不允许这样做:

private lateinit var port: Int;

我可以用什么来将类似value的整数标记为lateate?

我了解为什么不起作用(Int是原始的),我需要知道该用什么代替

编辑1

这不是重复的,因为我想知道在这种情况下使用什么,而不是为什么发生:Why doesn't Kotlin allow to use lateinit with primitive types?

编辑2 如下面@Roland所建议-BitInteger为我工作:

private lateinit var port: BigInteger;

我正好用它来生成URL,所以我真的只需要在String串联中使用它。

3 个答案:

答案 0 :(得分:1)

我不知道您要寻找的完美解决方案,但是我是这样做的(以防您实际上被迫使用原始类型):

 class Example{
    private var _port: Int? = null

    var port:Int
         get() = this._port!!
         set(i) { _port = i }
    }

至少,这使您可以使用该属性,就像不可为空一样。 到目前为止,我们为我们找到的最佳解决方案!

答案 1 :(得分:1)

我想到了一些变体,但是取决于以后使用的方式,可能都不适合您。

  1. 仅使用默认值,例如:

    var port : Int = 8080
    
  2. 使用其他一些Number类型而不是Int,例如

    class Server {
      lateinit var port : Number
    }
    

    如果需要,您可以致电port.toInt()。但是:Number类型很多,因此将其范围缩小到例如BigInteger可能有意义。否则,您可能会得到对象,而您根本不想接受。

  3. 使用Delegates.notNull

    var port : Int by Delegates.notNull()
    

    但是:即使您保留了null值,也无法检查变量是否已初始化,因此,只要访问它就必须处理一个异常。 。我认为这不是很好...但是,如果您确定自己有一个价值,那对您也可以。

  4. 只需使用Int?并跳过lateinit,例如:

    class Server {
      var port : Int? = null
    }
    

    您会要求使用::port.isInitialized而不是port != null,但是:您现在需要处理可能的null值,但是使用?则不应该这样一个大问题。

  5. Int?Delegates.vetoable一起使用,以防在获得第一个值后不想接受null值,基本上使之类似于lateinit ;-)

    class Server {
      var port : Int? by Delegates.vetoable(null as Int?) {
        _, _, newValue -> newValue != null
      }
    }
    

    并使用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(":")

::port.isInitialized难道难道不难吗?

答案 2 :(得分:0)

如果您的项目不是跨平台的,则显而易见的解决方案是

Int

BigInteger值一一对应(不同于#=Comment#)。