kotlin数据类与密封类(代码片段)

navysummer navysummer     2022-12-02     195

关键词:

数据类

Kotlin 可以创建一个只包含数据的类,关键字为 data:

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

编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:

  • equals() / hashCode()
  • toString() 格式如 "User(name=John, age=42)"
  • componentN() functions 对应于属性,按声明顺序排列
  • copy() 函数

如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。

为了保证生成代码的一致性以及有意义,数据类需要满足以下条件:

  • 主构造函数至少包含一个参数。

  • 所有的主构造函数的参数必须标识为val 或者 var ;

  • 数据类不可以声明为 abstractopensealed 或者 inner;

  • 数据类不能继承其他类 (但是可以实现接口)。

复制

复制使用 copy() 函数,我们可以使用该函数复制对象并修改部分属性, 对于上文的 User 类,其实现会类似下面这样:

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

实例

使用 copy 类复制 User 数据类,并修改 age 属性:

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


fun main(args: Array<String>) 
    val jack = User(name = "Jack", age = 1)
    val olderJack = jack.copy(age = 2)
    println(jack)
    println(olderJack)

输出结果为:

User(name=Jack, age=1)
User(name=Jack, age=2)

数据类以及解构声明

组件函数允许数据类在解构声明中使用:

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"

标准数据类

标准库提供了 Pair 和 Triple 。在大多数情形中,命名数据类是更好的设计选择,因为这样代码可读性更强而且提供了有意义的名字和属性。


密封类

密封类用来表示受限的类继承结构:当一个值为有限几种的类型, 而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合 也是受限的,但每个枚举常量只存在一个实例,而密封类 的一个子类可以有可包含状态的多个实例。

声明一个密封类,使用 sealed 修饰类,密封类可以有子类,但是所有的子类都必须要内嵌在密封类中。

sealed 不能修饰 interface ,abstract class(会报 warning,但是不会出现编译错误)

sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()

fun eval(expr: Expr): Double = when (expr) 
    is Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN

使用密封类的关键好处在于使用 when 表达式 的时候,如果能够 验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了。

fun eval(expr: Expr): Double = when(expr) 
    is Expr.Const -> expr.number
    is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
    Expr.NotANumber -> Double.NaN
    // 不再需要 `else` 子句,因为我们已经覆盖了所有的情况

深入kotlin-数据类和密封类(代码片段)

Dataclass定义Kotlin中对java中的pojo类型进行了专门的支持和简化,叫做数据类(dataclass)。一个数据类的定义非常简单,仅有一个主构造方法即可:dataclassPerson(valname:String,varage:Int,varaddress:String)//使用dataclassvarpers 查看详情

kotlin初学者枚举类-密封类-数据类-继承(代码片段)

...介:CSDN博客专家、华为云享专家认证系列专栏:Kotlin初学者学习交流:三人行必有我师焉;择其善者而从之,其不善者而改之。目录一、枚举类1.1创建枚举类1.2获取枚举相关信息1.3枚举类添加属性1.4定义函数1... 查看详情

kotlin学习手记——单例内部类数据类枚举类密封类内联类(代码片段)

Kotlin单例:只需要类前面添加object关键字即可,object定义类等价于java的恶汉式的单例模式objectSingletonvarx:Int=2funy()init//object不能定义构造函数,但可以定义init块object不能定义构造函数,但可以定义init块使用ÿ... 查看详情

对比java学kotlin密封类(代码片段)

从JavaSE15开始,Java也支持密封类了。什么是密封类?在Kotlin中类修饰符除了open、abstract、data这些,还有一个sealed:sealedinterfaceError//注意,sealed在Kotlin1.5版本后才支持修饰interfacesealedclassIOError:Errorconstr 查看详情

对比java学kotlin密封类(代码片段)

从JavaSE15开始,Java也支持密封类了。什么是密封类?在Kotlin中类修饰符除了open、abstract、data这些,还有一个sealed:sealedinterfaceError//注意,sealed在Kotlin1.5版本后才支持修饰interfacesealedclassIOError:Errorconstr 查看详情

对比java学kotlin密封类(代码片段)

什么是密封类?在Kotlin中类修饰符除了open、abstract、data这些,还有一个sealed:sealedinterfaceError//注意,sealed在Kotlin1.5版本后才支持修饰interfacesealedclassIOError:Errorconstructor()/*...*///protectedbyd 查看详情

kotlin常用的kotlin类②(枚举类|枚举类定义函数|密封类)(代码片段)

...普通函数2、枚举类定义构造函数三、密封类一、枚举类Kotlin中使用枚举类定义常量,枚举类定义格式如下:枚举常量都是枚举类的实例对象;enumclass枚举类类型名 枚举常量1, 枚举常量2, ...代码示例:enumclassGenderMALE,FEMALEfunmain()println(Ge... 查看详情

kotlin常用的kotlin类②(枚举类|枚举类定义函数|密封类)(代码片段)

...普通函数2、枚举类定义构造函数三、密封类一、枚举类Kotlin中使用枚举类定义常量,枚举类定义格式如下:枚举常量都是枚举类的实例对象;enumclass枚举类类型名 枚举常量1, 枚举常量2, ...代码示例:enumclassGenderMALE,FEMALEfunmain()println(Ge... 查看详情

kotlin中嵌套类数据类枚举类和密封类的详解(代码片段)

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家👉点击跳转到教程一、嵌套类如果一个类只对另一个类有用,那么将其嵌入到该类中并使这两个类保持在一起... 查看详情

深入kotlin-数据类和密封类(代码片段)

Dataclass定义Kotlin中对java中的pojo类型进行了专门的支持和简化,叫做数据类(dataclass)。一个数据类的定义非常简单,仅有一个主构造方法即可:dataclassPerson(valname:String,varage:Int,varaddress:String)//使用dataclassvarpers... 查看详情

kotlin抽象类密封类接口(代码片段)

1.抽象类(1)概念?从多个具有相同特征的类中抽象出一个使用abstract修饰的类,以这个抽象类作为其子类模板,从而避免子类设计的随意性。抽象类的设计是一种模板模式的设计模式。(2)特点抽象类、抽象属性、抽象方法都... 查看详情

在kotlin中使用带有rxjava的密封类时,类型不匹配(代码片段)

我有以下代码sealedclassAddressUiStateobjectAddressLoading:AddressUiState()classAddressLoadedState(valaddressResponse:AddressBookResponse):AddressUiState()classAddressErrorState(valerror:Throwable):AddressUi 查看详情

kotlin学习——数据类,泛型,嵌套类与内部类,对象表达式和对象声明(代码片段)

一.数据类数据类和JAVA中的javabean类似,只作用于保存一些数据,所以如果创建,会默认生成一些函数,并且会被标记为data:equals()/hashCode()toString()componentN()copy()我们来看下标准的写法dataclassUser(valname:String,valage:Int)... 查看详情

从 Kotlin 中的密封类扩展数据类

】从Kotlin中的密封类扩展数据类【英文标题】:ExtendingdataclassfromasealedclassinKotlin【发布时间】:2017-11-0905:46:33【问题描述】:我有一组共享一些公共字段的数据类,所以理想情况下,我想在超类型中声明它们(本例中为Message)... 查看详情

kotlin内部类与嵌套类(代码片段)

kotlin内部类与嵌套类简单的说,kotlin嵌套类相当于java的静态内部类,kotlin内部类相当于java普通内部类。classOutClassvalocval="一个外部类变量值"//嵌套类,相当于Java的静态内部类classNestedClassfuntest1()="嵌套... 查看详情

kotlin内部类与嵌套类(代码片段)

kotlin内部类与嵌套类简单的说,kotlin嵌套类相当于java的静态内部类,kotlin内部类相当于java普通内部类。classOutClassvalocval="一个外部类变量值"//嵌套类,相当于Java的静态内部类classNestedClassfuntest1()="嵌套... 查看详情

kotlin类与继承(代码片段)

类kotlin中使用关键字class声明类类声明由类名,类头(指定其类型参数,主构造函数等),花括号包围的类体构成,类头和类体都是可选的。classStudent如果一个类没有类体,则可以省略花括号classEmpty主... 查看详情

kotlin基础(十四)枚举类(enum)数据类(data)和密封类(sealed)与java的写法差异

...参数列表,你可以在enum的内部去声明字段和方法。但在kotlin中,这有点不太一样:enumclassSize(valabbreviation:String)SMALL( 查看详情