0

在编写验证函数时,这些验证函数通常会检查可空性。即使在调用这些函数之后,对象成员可以像不可为空一样安全地使用,但 Kotlin 编译器合约不允许指定此行为。

例如:

data class EmployeeDto(
  val name: String?,
  val longitude: String?,
  val latitude: String?
) {
  @ExperimentalContracts
  fun validate() {
    //contract { returns() implies (this.name != null && this.longitude != null && this.latitude != null) }
    // Error in contract description: only references to parameters are allowed in contract description

    if (name.isNullOrEmpty())
      throw RequiredValueNotSetException("Name was set to \"$name\" but can not be null or empty")
    if (longitude.isNullOrEmpty())
      throw RequiredValueNotSetException("Longitude was set to \"$longitude\" but can not be null or empty")
    if (latitude.isNullOrEmpty())
      throw RequiredValueNotSetException("Latitude was set to \"$latitude\" but can not be null or empty")
  }

这种约束背后的基本原理是什么,或者这是计划在未来添加的功能?

4

1 回答 1

1

这种约束背后的基本原理是什么?

Kotlin 合约在设计和实现中都是一个实验性功能。很多约束都存在,因为执行具有这些约束的合约更容易/更快。

这是计划在未来添加的功能吗?

将来可能会取消仅引用方法参数的限制。

很难说 kotlin 合约会发生什么,因为除了KEEP和相应的讨论之外,并没有任何官方的合约路线图。在这篇文章的评论中,一位 kotlin 团队成员提到,在新的编译器前端之后将进行一些合同改进,而新的编译器前端本身仍在路线图上。

于 2021-04-07T02:44:25.697 回答