2017-12-14 16 views
1

에 대한 해결 방법을 검색 :코 틀린 빈 데이터 클래스 기본 생성자 주어진 코 틀린 코드와

sealed class Event(val id:String= UUID.randomUUID().toString(), val timestamp:Instant = Instant.now()) 
data class BarEvent(val additionalInfo:String):Event() 
object FooEvent:Event() 
// data class CorrectFooEvent():Event() // invalid kotlin 

fun main(args: Array<String>) { 
    val b1 = BarEvent("b1") 
    val f1 = FooEvent 
    Thread.sleep(1000) 
    val b2 = BarEvent("b2") 
    val f2 = FooEvent 

    println("${b1.id} ${b1.timestamp} $b1") 
    println("${f1.id} ${f1.timestamp} $f1") 
    println("${b2.id} ${b2.timestamp} $b2") 
    println("${f2.id} ${f2.timestamp} $f2") 
} 

BarEvent 아무 문제가 없다합니다.

그러나 FooEvent에는 Event에있는 매개 변수보다 더 많은 매개 변수가 없으므로 빈 생성자를 갖고 싶습니다. 데이터 클래스에 대한 권한이 없으므로 객체로 만들었습니다. 그러나 객체는 싱글 톤이므로 instanciated 이벤트로 동작하지 않습니다.

(A data class으로 클래스를 유지) 내가 볼 수있는 유일한 해결 방법은 같은 것입니다 :

sealed class Event(open val id:String= UUID.randomUUID().toString(), open val timestamp:Instant = Instant.now()) 
data class FooEvent(override val id:String= UUID.randomUUID().toString(), override val timestamp:Instant = Instant.now()):Event() 

그러나 그것은 매우 우아 아니다.

답변

2

그냥 일반 클래스에 FooEvent을 변경하고 추가 (또는 IDE 사용하여 생성) 필요한 경우 toString(), hashCode()equals(Object)을 :

class FooEvent: Event() { 
    override hashCode() = ... 
    override equals(other: Object) { 
     ... 
    } 
    override toString() = ... 
} 

이벤트 데이터 클래스하려면 단순히 사용되지 않는 속성을 추가 그것에. 꽤 있지만,이 순간에 코 틀린 될 수있는 한 짧게하지 :

:

data class FooEvent(val dummy: Unit = Unit) : Event() 

곧이 제한을 제거 할 의도가 없을 것 같다

+0

고마워요.하지만 "데이터 클래스"의 복사 및 소멸 기능을 잃어버린 것입니다. 그래서 나는 "클래스를 데이터 클래스로 유지"라고 말했다. –

+0

그들의 결정은 1.0 시간에 의미가있는 것처럼 보입니다. 파괴되지 않으며 데이터 클래스의 상속도 없습니다. 그러나 지금, it'a는 별난. .. 어떻게라도 고마워한다. –

+0

편집하기 전에 답이 옳았습니다. 이 경우 데이터 클래스를 사용하지 않아야합니다. 데이터 클래스 문서에서 상속 된 필드는 데이터 클래스 기능에 포함되지 않습니다. "컴파일러는 기본 생성자 * :"에 선언 된 모든 속성에서 다음 멤버를 자동으로 파생시킵니다. (그것을 지적 해 주신 kotlinglang slack 커뮤니티에 감사드립니다) –