Kotlin中的数据类

有什么区别:

定义1

data class Person (var name:String, var age:Int) 

定义2

 class Person (var name:String, var age:Int) 

定义3

 class Person (){ var name:String = "" var age:Int = 1 } 

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

在这里输入图像描述

equalshashCodetoString差异

定义1定义2和3之间最重要的区别是在定义1中equalshashcodetoString方法将被覆盖。

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

构造函数的区别

定义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 } 

copy方法

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

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

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

定义1( data class Person(var name: String, var age: Int )等价于

 /* every class by default in kotlin is final but a data class CAN'T be open */ final class Person(var name: String, var age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other?.javaClass != javaClass) return false other as Person if (name != other.name) return false if (age != other.age) return false return true } override fun hashCode(): Int { var result = name.hashCode() result = 31 * result + age return result } } val person = Person("Name", 123) 

定义2( class Person(var name: String, var age: Int [no data modifier])是等价的

 class Person(var name: String, var age: Int) { } val person = Person("Name", 123) 

定义3是等价的

 class Person() { var name: String = "" var age: Int = 1 } val person = Person() // name = "", age = 1 (by default) person.name = "Name" person.age = 123