关键词:
数据类
Kotlin 可以创建一个只包含数据的类,关键字为 data:
data class User(val name: String, val age: Int)
编译器会自动的从主构造函数中根据所有声明的属性提取以下函数:
equals()
/hashCode()
toString()
格式如"User(name=John, age=42)"
componentN() functions
对应于属性,按声明顺序排列copy()
函数
如果这些函数在类中已经被明确定义了,或者从超类中继承而来,就不再会生成。
为了保证生成代码的一致性以及有意义,数据类需要满足以下条件:
-
主构造函数至少包含一个参数。
-
所有的主构造函数的参数必须标识为
val
或者var
; -
数据类不可以声明为
abstract
,open
,sealed
或者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( 查看详情