Kotlin中的数据类

jos*_*jan 4 kotlin kotlin-interop

有什么区别:

定义1

data class Person (var name:String, var age:Int)
Run Code Online (Sandbox Code Playgroud)

定义2

class Person (var name:String, var age:Int)
Run Code Online (Sandbox Code Playgroud)

定义3

class Person (){
    var name:String = ""
    var age:Int = 1
}
Run Code Online (Sandbox Code Playgroud)

在3种情况下,当我使用自动完成时,我看到像POJO一样的可用方法...是相同但3种不同的方式?

在此输入图像描述

Eri*_*ric 14

差异,equalshashCode,&toString

之间最重要的区别定义1定义2和3是在定义1equals,hashcodetoString方法被覆盖为您提供:

  • equalshashCode方法测试结构平等
  • toString 方法返回一个漂亮的,人性化的字符串

代码示例:

注意:在Kotlin中,==操作员调用对象的.equals()方法.有关详细信息,请参阅kotlinlang.org上的运算符重载.

data class Person1 (var name:String, var age:Int)
class Person2 (var name:String, var age:Int)

@Test fun test1()
{
    val alice1 = Person1("Alice", 22)
    val alice2 = Person1("Alice", 22)
    val bob = Person1("bob", 23)

    // alice1 and alice2 are structurally equal, so this returns true.
    println(alice1 == alice2)   // true

    // alice1 and bob are NOT structurally equal, so this returns false.
    println(alice1 == bob)      // false

    // the toString method for data classes are generated for you.
    println(alice1)     // Person1(name=Alice, age=22)
}

@Test fun test2()
{
    val alice1 = Person2("Alice", 22)
    val alice2 = Person2("Alice", 22)
    val bob = Person2("bob", 23)

    // even though alice1 and alice2 are structurally equal, this returns false.
    println(alice1 == alice2) // false
    println(alice1 == bob)    // false

    // the toString method for normal classes are NOT generated for you.
    println(alice1)  // Person2@1ed6993a
}
Run Code Online (Sandbox Code Playgroud)

构造函数的差异

定义1和2定义3之间的另一个区别是:

  • 定义1和2都有一个带2个参数的构造函数
  • 定义3只有一个无参数构造函数,可以为类成员分配默认值.

代码示例:

data class Person1 (var name:String, var age:Int)
class Person2 (var name:String, var age:Int)
class Person3 ()
{
    var name:String = ""
    var age:Int = 1
}

@Test fun test3()
{
    Person1("alice",22)     // OK
    Person2("bob",23)       // OK
    Person3("charlie",22)   // error

    Person1()   // error
    Person2()   // error
    Person3()   // OK
}
Run Code Online (Sandbox Code Playgroud)

copy方法

最后,定义1定义2和3之间的另一个区别在于,在定义1中,为其生成copy方法.以下是如何使用它的示例:

val jack = Person1("Jack", 1)
val olderJack = jack.copy(age = 2)

// jack.age = 1
// olderJack.age = 2
Run Code Online (Sandbox Code Playgroud)

查看kotlinlang.org上数据类的官方文档!