Kotlin中的数据和对象类之间的区别是什么?每个对象的目的是什么?
data class User(val name: String, val age: Int)
和
object user {
val name = ""
fun printName(name: String) = "Hello, $name!"
}
答案 0 :(得分:4)
object
object
是Kotlin创建由编译器实例化的单例(一个实例类)的方法。
data class
数据类就像通常的类,但是有一些优点/缺点。
优势
equals()
/ hashCode()
toString()
componentN()
copy()
这些是根据构造函数中指定的属性创建的。
限制
答案 1 :(得分:0)
Kotlin的object
类似于Java中的类,其中所有方法和变量都是静态的。
object User {
val name = ""
fun printName(name: String) = "Hello, $name!"
}
Kotlin中的与Java中的以下类似:
class User {
public static String name = "";
public static String printName(name: String) {
return "Hello " + name + "!";
}
}
用法示例:
//Kotlin
User.printName(User.name)
//Java
User.printName(User.name);
但是object
与我给出的Java比较并不完全相同。它可以继承接口和类,并且对象本身被实例化为单例实例。如果您用@JvmStatic
注释对象内部的方法,它们将成为真正的静态成员。
Kotlin中的data
类只是一种简单的语法,该类没有(或最少)逻辑,并且包含某些值。 Kotlin会在数据类中为您生成equals()
,hashCode()
和toString()
函数,以及其他一些辅助函数。
data class User(val name: String, val age: String)
在Kotlin中,在Java中将如下所示:
class User {
public final String name;
public final String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object other) {
//Kotlin-generated equality check
}
@Override
public long hashCode() {
//Kotlin's hashcode
}
@Override
public String toString() {
return "User(name=" + name + ",age=" + age + ")";
}
//other generated methods
}
答案 2 :(得分:0)
简而言之,使用对象,如果要创建单例,则该类的唯一对象和数据类是具有相等的类,hashCode,toString自动生成...
答案 3 :(得分:0)
首先,没有对象类,您要引用的功能称为对象声明。
这是Kotlin中的一项功能,可让您实施singleton。对象声明在单个语句中结合了类声明和类的单个实例的声明。
// Let's assume that class Person is defined somewhere else
object Payroll {
val employees = arrayListOf<Person>()
fun calculateSalary() {
for (person in employees) {
// ...
}
}
}
// calling methods and properties
>>> Payroll.employees.add(Person("John", 23)) // calling a property
>>> Payroll.calculateSalary() // calling a method
对象声明就像类一样,可以包含属性,方法,初始化程序块等的声明。唯一不允许他们的人是构造者(主要或次要)。
对象声明是在定义时立即创建的,而不是通过代码中其他位置的构造函数调用来创建。
注意:object
关键字也可以用于companion objects和object expressions。
创建主要目标是保存数据的类非常普遍。如果希望您的类方便保存数据,则需要重写通用对象方法:
toString()
-字符串表示形式equals()
-对象相等hashCode()
-哈希容器但是,通过将修饰符数据添加到类中,可以自动为您添加必要的方法。此外,还会生成以下方法:
componentN()
函数按照其声明顺序与属性相对应copy()
功能class PersonClass(val name: String, val age: Int) // regular class
data class PersonDataClass(val name: String, val age: Int) // data class
总而言之,如果需要数据的持有者,则应使用数据类,这意味着将修饰符数据添加到类中。这将为您生成以下方法:toString()
,equals()
,hashCode()
,componentN()
和copy()
,因此避免编写样板代码。另一方面,如果需要创建单例,则可以使用对象声明功能。