programing

Kotlin Android에서 데이터 클래스용 빈 생성자를 만드는 방법

muds 2023. 8. 29. 21:01
반응형

Kotlin Android에서 데이터 클래스용 빈 생성자를 만드는 방법

저는 코틀린 데이터 클래스에 10개 이상의 변수가 선언되어 있는데, 자바에서 일반적으로 하는 것처럼 빈 생성자를 만들고 싶습니다.

데이터 클래스:

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)

그러나 데이터 클래스에서는 생성자를 생성하는 동안 모든 인수를 전달해야 합니다.Java POJO 클래스 생성자처럼 이를 단순화하려면 어떻게 해야 합니까?

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

여기에는 두 가지 옵션이 있습니다.

  1. 기본 생성자 매개 변수에 기본값을 할당합니다.

    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>()
    ) 
    
  2. 매개 변수가 없는 보조 생성자 선언:

    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>()
                             )
    }
    

당신이 의지하지 않는다면,copy또는equalsActivity클래스 또는 자동 생성된 것을 사용하지 않음data class메소드는 일반 클래스를 다음과 같이 사용할 수 있습니다.

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가 필요한 것은 아닙니다.data class그리고 역도 성립.실제로 제 경험상 데이터 클래스는 복잡한 비즈니스 논리를 포함하는 영역에서 특히 유용합니다.

모든 필드에 기본값을 지정할 경우, 빈 생성자는 Kotlin에 의해 자동으로 생성됩니다.

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

간단히 전화할 수 있습니다.

val user = User()

이것에 대한 현대적인 대답은 코틀린의 것을 사용하는 것이어야 합니다.no-arg compiler plugin여기에 대한 고전적인 apies에 대한 비인수 구성 코드를 생성합니다.

단순히 build.gradle 프로젝트 수준에서 플러그인 클래스 경로를 추가해야 합니다.

    dependencies {
    ....

    classpath "org.jetbrains.kotlin:kotlin-noarg:1.4.10"

    ....
    }

그런 다음 생성하도록 주석을 구성합니다.no-arg시공자

apply plugin: "kotlin-noarg"

noArg {
      annotation("your.path.to.annotaion.NoArg")
      invokeInitializers = true
}

그런 다음 주석 파일을 정의합니다.NoArg.kt

 @Target(AnnotationTarget.CLASS)
 @Retention(AnnotationRetention.SOURCE)
 annotation class NoArg

마지막으로 모든 데이터 클래스에서 단순히 자신의 주석을 사용할 수 있습니다.

@NoArg
data class SomeClass( val datafield:Type , ...   )

나는 나만의 것을 만들곤 했습니다.no-arg컨스트럭터는 승인된 답변으로, 검색을 통해 얻었지만 이 플러그인이 출시되거나 뭔가가 출시되었고 훨씬 깨끗하다는 것을 알게 되었습니다.

@miensol 답변과 함께 다음과 같은 세부 정보를 추가합니다.

데이터 클래스를 사용하는 Java 표시 빈 생성자를 사용하려면 이를 명시적으로 정의해야 합니다.

기본값 + 생성자 지정자를 사용하는 것은 매우 쉽습니다.

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.
}

즉, 이 방법을 사용하여 표준 Java serializer(Jackson, Gson 등)를 사용하여 이 개체를 serialize/deserialize할 수 있습니다.

각 기본 생성자 매개변수에 기본값을 지정하는 경우:

data class Item(var id: String = "",
            var title: String = "",
            var condition: String = "",
            var price: String = "",
            var categoryId: String = "",
            var make: String = "",
            var model: String = "",
            var year: String = "",
            var bodyStyle: String = "",
            var detail: String = "",
            var latitude: Double = 0.0,
            var longitude: Double = 0.0,
            var listImages: List<String> = emptyList(),
            var idSeller: String = "")

그리고 논쟁 없이 또는 그 순간의 논쟁과 함께 그것을 부를 수 있는 인스턴스들로부터.

var newItem = Item()

var newItem2 = Item(title = "exampleTitle",
            condition = "exampleCondition",
            price = "examplePrice",
            categoryId = "exampleCategoryId")

Kotlin의 데이터 클래스에 대한 비어 있지 않은 보조 생성자:

data class ChemicalElement(var name: String,
                           var symbol: String,
                           var atomicNumber: Int,
                           var atomicWeight: Double,
                           var nobleMetal: Boolean?) {

    constructor(): this("Silver", "Ag", 47, 107.8682, true)
}

fun main() {
    var chemicalElement = ChemicalElement()
    println("RESULT: ${chemicalElement.symbol} means ${chemicalElement.name}")
    println(chemicalElement)
}

// RESULT: Ag means Silver

// ChemicalElement(name=Silver, symbol=Ag, atomicNumber=47, 
//                 atomicWeight=107.8682, nobleMetal=true)

Kotlin의 데이터 클래스에 대한 보조 생성자 비우기:

data class ChemicalElement(var name: String,
                           var symbol: String,
                           var atomicNumber: Int,
                           var atomicWeight: Double,
                           var nobleMetal: Boolean?) {

    constructor(): this("", "", -1, 0.0, null)
}

fun main() {
    var chemicalElement = ChemicalElement()
    println(chemicalElement)
}

// ChemicalElement(name=, symbol=, atomicNumber=-1, 
//                 atomicWeight=0.0, nobleMetal=null)

설명서에서

참고: JVM에서 주 생성자의 모든 매개 변수가 기본값을 가질 경우 컴파일러는 기본값을 사용하는 추가 매개 변수 없는 생성자를 생성합니다.이를 통해 매개 변수 없는 생성자를 통해 클래스 인스턴스를 만드는 Jackson 또는 JPA와 같은 라이브러리에서 Kotlin을 더 쉽게 사용할 수 있습니다.

기본 생성자를 수정하고 각 매개 변수에 기본값을 추가하는 것이 좋습니다.

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>()
)

null을 null로 하여 값을 .?그리고 나서 당신은 바보짓을 할 수 있습니다.null:

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

일반적으로 무효 개체를 피하는 것이 좋습니다. 즉, 사용할 필요가 없는 방식으로 코드를 작성합니다.nullable이 아닌 객체는 Java와 비교하여 Kotlin의 장점 중 하나입니다.따라서 위의 첫 번째 옵션이 더 좋습니다.

두 옵션 모두 원하는 결과를 제공합니다.

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

언급URL : https://stackoverflow.com/questions/37873995/how-to-create-empty-constructor-for-data-class-in-kotlin-android

반응형