validation - 如何在 Kotlin 中实现验证构造函数?

标签 validation constructor kotlin builder

我正在 Kotlin 中实现 vars,它可以接收来自某些用户的越界输入。我希望能够选择性地调用(仅在来自这些不受信任的用户的输入上)可以返回 null 的验证构造函数,然后在输入无效的情况下使用 Elvis 运算符指定默认值,如:var myFoo = Foo.fromInt(i) ?: 1 .我目前正在使用伴随对象方法来验证输入:

open class Foo(val x:Int) {   // relies on valid x in 1..3
  companion object {
    fun fromInt(x: Int): Foo? = if (x in 1..3) Foo(x) else null
  }
}
class Bar(x:Int) : Foo(x)

fun main(args:Array<String>) {
  println(Foo.fromInt(2))    // Foo(2)
  println(Foo.fromInt(20))   // null
  // println(Bar.fromInt(2))
  // would like Bar(2) but as expected, companion isn't inherited
}

当我继承 Foo ,我知道我必须重新创建伴生对象。我尝试从抽象类继承同伴;但是,调用 Foo(x)仍然指向 Foo而不是 Bar , 除非我覆盖 fromInt在每个子类的同伴中。是否有更好或更多 Kotlin 惯用的方法来处理这种可以返回 null 的验证构造函数模式?而不是创建请求的对象?

最佳答案

您可以使用 init block 以及 require .

open class Foo(val x:Int) {
  init {
    require(x in 1..3) {
      "relies on valid x in 1..3"
    }
  }
}
class Bar(x:Int) : Foo(x)

示例运行:
>>> open class Foo(val x:Int) {
...   init {
...     require(x in 1..3) {
...       "relies on valid x in 1..3"
...     }
...   }
... }
>>> class Bar(x:Int) : Foo(x)
>>> val b = Bar(3)
>>> val b = Bar(4)
java.lang.IllegalArgumentException: relies on valid x in 1..3
    at Line_18$Foo.<init>(Line_18.kts:3)
    at Line_19$Bar.<init>(Line_19.kts:1)
>>> b.x
res22: kotlin.Int = 3

关于validation - 如何在 Kotlin 中实现验证构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46874406/

相关文章:

javascript - 如何验证一系列文本框中的文本框值是否为空?

java - Spring Validation 在我的消息代码中添加后缀

javascript - Object.getPrototypeOf() 与 Javascript 中的 Object.constructor.prototype 相同吗?

c++ - 以 "almost always auto"样式初始化 ZeroMQ 2.2 消息要使用私有(private)构造函数

具有更改的 var 值的 Kotlin 数据类副本

jquery - Kotlin JS Overriding 'external' function with optional parameters error

android - 使用 Kotlin 数据类的 Json 解析器正确返回 json 数据,但是为什么解析器(MockK)的单元测试会失败?

javascript - 将 View 模型映射到 KnockoutJS 验证

javascript - 如何验证 angularjs 中的子属性?

java - 如何通过传递 Object[] 而不是带反射的参数列表来创建类的新实例