0
나는 Kotlin에 특정 사용자로부터 범위를 벗어나는 입력을받을 수있는 vars를 구현하고 있습니다. 선택적으로 null을 반환 할 수있는 유효성을 검사하는 생성자를 호출하고 (이 신뢰할 수없는 사용자의 입력에만 해당), 유효하지 않은 입력의 경우 기본값 인 Elvis 연산자를 사용하여 var myFoo = Foo.fromInt(i) ?: 1
을 호출 할 수 있습니다. Kotlin에서 유효성 검사중인 생성자를 구현하는 방법은 무엇입니까?
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
이 아닙니다. 요청한 객체를 생성하는 대신
null
을 반환 할 수있는 유효성 검사중인 생성자 패턴과 같은 종류의 Kotlin-idomatic 방법을 다루는 것이 더 낫겠습니까?
나는 그것을 시도했습니다. 문제는'Foo' (내 응용 프로그램에서)는 데이터베이스의 필드 유형이므로 각 레코드에 해당 유형의 필드가 10 개 이상 있고 유효성 검사 실패시 기본값이 다른 필드가 있습니다. 사실,이 10 개 이상을 몇 개의 그룹으로 그룹화 할 수 있었기 때문에 동일한 기본 유형'Foo'의 여러 유형을 처리하기 위해'Bar','Baz' 하위 클래스를 작성하려고했습니다. 'Bar', 'Baz'등에서조차도 기록에 각각 하나 이상이 있으며 각기 다른 기본값이 있습니다. 그래서 널 생각 했어/엘비스가 그걸 처리 할 수있는 좋은 방법일지도 몰라 ... 다른 옵션들? – sirksel
'IllegalArgumentException'에 대한 두 번째 요점은 내 다음 최고의 옵션이라고 생각합니다. 그러나 이러한 경우에는 ** 실패가 예상되며 ** 자주 발생합니다. 나는 또한 비하인드의 디폴트를 만들고 싶지 않았다 ... 그래서 호출 사이트에서 적용된'? : default'를 드러내고 싶었지만 작동을 위해서는'orNull' 보조 생성자가 필요하다. . 인스턴스화의 90 %가 기본 null-safe 생성자이지만, 보조/2 차 유효성 검사 생성자는 오류가 발생할 가능성이있는 외부 입력을 처리하는 데만 사용됩니다. 그래도 다른 생각은 열려 있습니다 ... – sirksel
다른 옵션 : 해당 경우 서브 클래 싱은 유효성 검사에서 사용할 수있는 규칙을 제공해야합니다. – s1m0nw1