2017-10-22 18 views
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 방법을 다루는 것이 더 낫겠습니까?

답변

1

당신은 단순히 하나의 생성자를 사용하여 항상 인수 x를 확인하고 여기에 같은 속성에 할당 할 수 있습니다 :

open class Foo (x: Int) { // relies on valid x in 1..3 
    val x: Int = if (x in 1..3) x else 1 
} 

class Bar(x: Int) : Foo(x) 

지금 범위에없는 값으로 생성자를 호출, 기본 Foo입니다 나는 기본적으로 당신이 생각하기를 원했던 것입니다. 내 생각에 당신이 IllegalArgumentException을 던진다면 뒤에서 기본값을 만드는 것이 좋을 것입니다. 어떻게 생각해?

+0

나는 그것을 시도했습니다. 문제는'Foo' (내 응용 프로그램에서)는 데이터베이스의 필드 유형이므로 각 레코드에 해당 유형의 필드가 10 개 이상 있고 유효성 검사 실패시 기본값이 다른 필드가 있습니다. 사실,이 10 개 이상을 몇 개의 그룹으로 그룹화 할 수 있었기 때문에 동일한 기본 유형'Foo'의 여러 유형을 처리하기 위해'Bar','Baz' 하위 클래스를 작성하려고했습니다. 'Bar', 'Baz'등에서조차도 기록에 각각 하나 이상이 있으며 각기 다른 기본값이 있습니다. 그래서 널 생각 했어/엘비스가 그걸 처리 할 수있는 좋은 방법일지도 몰라 ... 다른 옵션들? – sirksel

+0

'IllegalArgumentException'에 대한 두 번째 요점은 내 다음 최고의 옵션이라고 생각합니다. 그러나 이러한 경우에는 ** 실패가 예상되며 ** 자주 발생합니다. 나는 또한 비하인드의 디폴트를 만들고 싶지 않았다 ... 그래서 호출 사이트에서 적용된'? : default'를 드러내고 싶었지만 작동을 위해서는'orNull' 보조 생성자가 필요하다. . 인스턴스화의 90 %가 기본 null-safe 생성자이지만, 보조/2 차 유효성 검사 생성자는 오류가 발생할 가능성이있는 외부 입력을 처리하는 데만 사용됩니다. 그래도 다른 생각은 열려 있습니다 ... – sirksel

+1

다른 옵션 : 해당 경우 서브 클래 싱은 유효성 검사에서 사용할 수있는 규칙을 제공해야합니다. – s1m0nw1