2016-06-17 3 views
45

데이터 클래스에 10+ 매개 변수가 있습니다. 빈 생성자로 데이터 클래스를 초기화하고 setter를 사용하여 몇 가지 매개 변수에 대해서만 값을 설정하고 개체를 전달하려고합니다. 서버.Kotlin 안드로이드에서 데이터 클래스에 대한 빈 생성자를 만드는 방법

data class Activity(
     var updated_on: String, 
     var tags: List<String>, 
     var description: String, 
     var user_id: List<Int>, 
     var status_id: Int, 
     var title: String, 
     var created_at: String, 
     var data: HashMap<*, *>, 
     var id: Int, 
     var counts: LinkedTreeMap<*, *>, 
) 

사용법 :이 같은

뭔가

   val activity = Activity(); 
       activity.title = "New Computer" 
       sendToServer(activity) 

쉬운 것입니다하지만 생성자를 작성하는 동안 모든 인수가 전달 될 필요합니다. 위처럼 단순화하려면 어떻게해야합니까?

   val activity = Activity(null,null,null,null,null,"New Computer",null,null,null,null); 
       sendToServer(activity) 

답변

71

현재 2 가지 옵션이 있습니다 :

  1. primary constructor 매개 변수에 기본값을 할당합니다

    data class Activity(
        var updated_on: String, 
        var tags: List<String>, 
        var description: String, 
        var user_id: List<Int>, 
        var status_id: Int, 
        var title: String, 
        var created_at: String, 
        var data: HashMap<*, *>, 
        var id: Int, 
        var counts: LinkedTreeMap<*, *> 
    ) { 
        constructor() : this("", emptyList(), 
             "", emptyList(), -1, 
             "", "", hashMapOf<Any, Any>(), 
             -1, LinkedTreeMap<Any, Any>() 
             ) 
    } 
    
  2. ,536 :

    data class Activity(
        var updated_on: String = "", 
        var tags: List<String> = emptyList(), 
        var description: String = "", 
        var user_id: List<Int> = emptyList(), 
        var status_id: Int = -1, 
        var title: String = "", 
        var created_at: String = "", 
        var data: HashMap<*, *> = hashMapOf<Any, Any>(), 
        var id: Int = -1, 
        var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>() 
    ) 
    
  3. 이 매개 변수가없는 그 a secondary constructor 선언을

    class ActivityDto { 
        var updated_on: String = "", 
        var tags: List<String> = emptyList(), 
        var description: String = "", 
        var user_id: List<Int> = emptyList(), 
        var status_id: Int = -1, 
        var title: String = "", 
        var created_at: String = "", 
        var data: HashMap<*, *> = hashMapOf<Any, Any>(), 
        var id: Int = -1, 
        var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>() 
    } 
    

    아니 모든 DTO 요구에 : 당신이 copy 또는 Activity 클래스의 equals에 의존하지 않거나과 같이 정규 클래스를 사용할 수있는 모든의 자동 생성 data class 방법을 사용하지 않는 경우

data class이고 반대의 경우도 마찬가지입니다. 실제로 필자의 경험에 비추어 볼 때 데이터 클래스는 복잡한 비즈니스 로직이 필요한 분야에서 특히 유용합니다.

+1

덕분에 @miensol이 복사 재미를 사용하여 수행 할 수있는 방법이 있습니까. 예. https://kotlinlang.org/docs/reference/data-classes.html#copying –

+0

@SaiKiran은'copy'를 사용하기 위해 데이터 클래스 인스턴스가 필요합니다. 이를 생성하려면 생성자를 호출해야합니다. 여기에 문제가있었습니다. – miensol

+0

Android Studio 2.3 용 Kotlin 1.1.2를 사용 중이며 emptyList를 사용할 수 없습니다./ – Gonzalo

3

@miensol 대답과 함께, 내가 몇 가지 세부 사항을 추가 할 수 있습니다 :

당신이 데이터 클래스를 사용하여 자바 눈에 보이는 빈 생성자를 원하는 경우

, 당신은 명시 적으로 정의 할 필요가있다. + 생성자 지정

사용하여 기본 값은 매우 쉽습니다 :

data class Activity(
    var updated_on: String = "", 
    var tags: List<String> = emptyList(), 
    var description: String = "", 
    var user_id: List<Int> = emptyList(), 
    var status_id: Int = -1, 
    var title: String = "", 
    var created_at: String = "", 
    var data: HashMap<*, *> = hashMapOf<Any, Any>(), 
    var id: Int = -1, 
    var counts: LinkedTreeMap<*, *> = LinkedTreeMap<Any, Any>() 
) { 
    constructor() : this(title = "") // this constructor is an explicit 
            // "empty" constructor, as seen by Java. 
} 

이이 트릭 당신은 지금/직렬화 표준 자바 시리얼 라이저 (잭슨, GSON 등)이 객체를 직렬화 할 수 있음을 의미합니다.

4

모든 필드에 기본값을 지정하면 - 빈 생성자가 Kotlin에 의해 자동 생성됩니다.

data class User(var id: Long = -1, 
       var uniqueIdentifier: String? = null) 

하고 간단하게 호출 할 수 있습니다

val user = User()