Kotlin学习笔记(七)数据类,密封类,嵌套类,内部类,枚举类

来源:互联网 发布:知乎 神回复 编辑:程序博客网 时间:2024/05/01 08:26

提示:本文为作者阅读Kotlin中文站学习笔记,建议读者移步Kotlin中文站学习完整教程。

数据类

开发中,我们经常需要创建一些只保存数据的类。Kotlin中,我们用data关键字定义一个数据类,编译器会自动从主构造函数中声明的所有属性生成以下成员:

  • equals()/hashCode()对
  • toString()
  • componentN() 按声明顺序对应于所有属性

如果这些函数中的任何一个在类体中显式定义,或继承自其基类,则不会自动生成。
为了保障生成的代码的一致性和有意义的行为,数据类必须满足以下要求:

  • 主构造函数必须有一个参数
  • 主构造函数中的参数必须标记为val或var
  • 数据类不能是抽象,开放,密封,或内部的
  • (1.1以前)数据类只能实现接口,(1.1以后)可以扩展其它类。
data class Data(val arg1: String,val arg2:Int,val arg3:Boolean)

在JVM中,如果主构造函数中的所有参数都有默认值,则编译器会为其自动生成一个无参的构造函数,它会使用默认值。

data class Data(val arg1: String="",val arg2:Int=0,val arg3:Boolean=true)

我们可以通过copy函数,复制一个对象,改变它的一部分属性,其它属性不变:

var data=Data();var anotherData=data.copy(arg1 = "Hello Kotlin!",arg2 = 100)//改变data对象的arg1属性值为"Hello Kotlin!",arg2属性值为100,arg3属性值保持不变

编译器为data类主构造函数中各属性生成的componentN函数,使它们可以在解析赋值中使用:

fun printData(){    var data=Data()    var anotherData=data.copy(arg1 = "Hello Kotlin!",arg2 = 100)//改变data对象的arg1属性值为"Hello Kotlin!",arg2属性值为100,arg3属性值保持不变    var (arg1,arg2,arg3)=anotherData    print("arg1=$arg1&arg2=$arg2&arg3=$arg3")//arg1=Hello Kotlin!&arg2=100&arg3=true}

密封类

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

要声明一个密封类,需要在类名前面添加 sealed 修饰符。虽然密封类也可以有子类,但是所有子类都必须在与密封类自身相同的文件中声明。

请注意,扩展密封类子类的类(间接继承者)可以放在任何位置,而无需在同一个文件中。

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

sealed class Color//密封类class Yello:Color()//黄色class Red:Color()//红色class Blue:Color()//蓝色fun printColor(color:Color){    when(color){        is Yello-> print("The color is Yello!")        is Red-> print("The color is Red")        is Blue-> print("The color is Blue")    }}

嵌套类

Kotlin中,一个类可以嵌套到另一个类中,这样的类叫嵌套类

//外部类class Outer{    var arg1:String=""    fun foo(){        print("foo in Outer")    }    //嵌套类    class Nested{        fun foo(){            print("foo in Nested")        }    }}

内部类

与嵌套类相似,内部类也是生命在另一个类的内部,但与嵌套类不同的是,内部类带有一个外部类对象的引用,因此,可以访问外部类的成员。内部类用inner关键字标注。

//外部类class Outer{    var arg1:String=""    fun foo(){        print("foo in Outer")    }    //内部类    inner class Inner{        fun foo(){            print("foo in Inner")            print(this@Outer.arg1)//访问Outer类中的成员属性            this@Outer.foo()//访问Outer类中过的成员函数        }    }}

枚举类

Kotlin中,用enum关键字标注一个枚举类,每个枚举常量都是枚举类的一个实例,枚举常量以逗号分隔:

//枚举类enum class RGB{    Red,Green,Blue}

每个枚举常量都有获取其名称和位置的属性

val name: Stringval ordinal: Int

可以通过以下方式获取到所有的枚举常量,或某一个枚举常量:

/枚举类enum class RGB{    Red,Green,Blue}fun printRgb(rgb:RGB){    RGB.values()//获取RGB所有的枚举常量    var red:RGB=RGB.valueOf("Red")//获取RGB名称为Red的枚举常量    print(red.name)// Red    print(red.ordinal)// 0    //kotlin 1.1起    enumValues<RGB>()//获取RGB所有的枚举常量    enumValueOf<RGB>("Red")//获取RGB名称为Red的枚举常量}
阅读全文
0 0
原创粉丝点击