kotlin - 用于 lateinit Int 值的 Kotlin 类型

标签 kotlin

Kotlin 不允许这样做:

private lateinit var port: Int;

我可以使用什么来将类似值的整数标记为允许延迟初始化?

我明白为什么这不起作用(Int 是原始的),我需要知道改用什么?

编辑 1

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

编辑 2
正如下面@Roland 所建议的那样——BitInteger 对我有用:
private lateinit var port: BigInteger;

我只是用它来生成一个 URL,所以我真的只需要在字符串连接中使用它。

最佳答案

我想到了一些变体,但取决于你以后如何使用它,没有一个可能适合你。

  • 只需使用默认值,例如:
    var port : Int = 8080
    
  • 使用其他一些Number -类型而不是Int ,例如
    class Server {
      lateinit var port : Number
    }
    

    然后您可以调用port.toInt()如果你需要。但是:有很多Number -types,因此将其缩小到例如BigInteger可能有道理。否则你可能会得到你不想接受的对象。
  • 使用 Delegates.notNull
    var port : Int by Delegates.notNull()
    

    但是:即使您节省了null -value 然后,您无法检查变量是否已初始化,因此您只需在要访问它时立即处理异常...我认为这不是很好...但是如果您确定得到一个值,那么这对你来说也可以。
  • 只需使用 Int?并跳过 lateinit ,例如:
    class Server {
      var port : Int? = null
    }
    

    而不是 ::port.isInitialized你会要求 port != null , 但是:你需要处理可能的 null -现在的值,但使用 ?这应该不是什么大问题。
  • 使用 Int?Delegates.vetoable如果您不想接受 null -values 在您获得第一个值之后,使其基本上类似于 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 再简单不过了?

    关于kotlin - 用于 lateinit Int 值的 Kotlin 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55047833/

    相关文章:

    java - Kotlin:符号在模块 'jdk.internal.opt' 中声明,该模块不导出包 'jdk.internal.joptsimple.internal'

    android - 为什么我们在 Kotlin 用例中使用调用运算符重载?

    android - 如何使用 DownloadManager 列

    java - 如何覆盖application.properties文件中spring boot starter的默认属性?

    design-patterns - 具有不同参数的 Kotlin 模式构建

    java - 我们可以将特定字母保留在顶部并按字母顺序排列吗?

    java - Android gradle : Exclude file from external dependencies

    android-studio - Android Studio 3.2 Canary 2 Kotlin 运行时验证错误 : Rejecting class

    android - 如何在应用程序 android Kotlin 中打开 webview 链接

    spring-mvc - 如何在 Spring 中使用 Kotlinx.html 代替 JSP 或 Thymeleaf 的普通 html 模板引擎?