Kotlin中的对象和数据类之间的区别是什么?

时间:2019-02-02 14:26:36

标签: android kotlin

Kotlin中的数据和对象类之间的区别是什么?每个对象的目的是什么?

data class User(val name: String, val age: Int)

object user {
    val name = ""
    fun printName(name: String) = "Hello, $name!"
}

4 个答案:

答案 0 :(得分:4)

object

object是Kotlin创建由编译器实例化的单例(一个实例类)的方法。


data class

数据类就像通常的类,但是有一些优点/缺点。

优势

  • equals() / hashCode()
  • toString()
  • componentN()
  • copy()

这些是根据构造函数中指定的属性创建的。

限制

  • 主要构造函数必须至少具有一个参数;
  • 所有主要的构造函数参数都需要标记为val或var;
  • 不能是抽象的,开放的,封闭的或内部的;
  • (1.1之前)只能实现接口。

答案 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's object


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
}

Kotlin's data class documentation

答案 2 :(得分:0)

简而言之,使用对象,如果要创建单例,则该类的唯一对象和数据类是具有相等的类,hashCode,toString自动生成...

答案 3 :(得分:0)

首先,没有对象类,您要引用的功能称为对象声明

Object declaration

这是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 objectsobject expressions

Data Class

创建主要目标是保存数据的类非常普遍。如果希望您的类方便保存数据,则需要重写通用对象方法:

  • 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(),因此避免编写样板代码。另一方面,如果需要创建单例,则可以使用对象声明功能。