Kotlin:数据类、密封类

return pwd;
}

public void setPwd(String pwd) {
this.pwd = pwd;
}

@Override
public String toString() {
return “User{” +
“name='” + name + ‘’’ +
“, pwd='” + pwd + ‘’’ +
‘}’;
}
}

分析:实现同一个功能,从代码量来说,KoltinJava少了很多行代码,比起更简洁。

1.3.2、修改数据类属性

例:修改User类的name属性

Kotlin版:

Koltin要修改数据类的属性,若属性使用val修饰,则只能使用其独有的copy()函数。其作用就是:修改部分属性,但是保持其他不变,若用var修饰,也可以用Setter()函数修改,这一点和Java一样

val mUser = User(“kotlin”,“123456”)
println(mUser)
mUser.name = “first new kotlin”
println(mUser)
val mNewUser = mUser.copy(name = “second new Kotlin”)
println(mNewUser)

输出结果为:

User(name=kotlin, pwd=123456)
User(name=first new kotlin, pwd=123456)
User(name=second new Kotlin, pwd=123456)

Java版:

User mUser = new User(“Java”,“123456”);
System.out.println(mUser);
mUser.setName(“new Java”);
System.out.println(mUser);

输出结果为:

User{name=‘Java’, pwd=‘123456’}
User{name=‘new Java’, pwd=‘123456’}

1.4、解构声明

  • 在前面讲到,Kotlin中定义一个数据类,则系统会默认自动根据参数的个数生成component1() … componentN()函数。其…,componentN()函数就是用于解构声明的

val mUser = User(“kotlin”,“123456”)
val (name,pwd) = mUser
println(“name = KaTeX parse error: Undefined control sequence: \tpwd at position 5: name\̲t̲p̲w̲d̲ = pwd”)

输出结果为:

name = kotlin    pwd = 123456

1.5、系统标准库中的标准数据类

  • 标准库提供了 Pair 和 Triple。尽管在很多情况下命名数据类是更好的设计选择, 因为它们通过为属性提供有意义的名称使代码更具可读性。
  • 其实这两个类的源码部分不多,故而贴出这个类的源代码来分析分析

1.5.1、源码分析

@file:kotlin.jvm.JvmName(“TuplesKt”)
package kotlin

// 这里去掉了源码中的注释
public data class Pair<out A, out B>(
public val first: A,
public val second: B) : Serializable {

// toString()方法
public override fun toString(): String = “( f i r s t ,   first,  first, second)”
}

// 转换
public infix fun <A, B> A.to(that: B): Pair<A, B> = Pair(this, that)

// 转换成List集合
public fun  Pair<T, T>.toList(): List = listOf(first, second)

// 这里去掉了源码中的注释
public data class Triple<out A, out B, out C>(
public val first: A,
public val second: B,
public val third: C ) : Serializable {

// toString()方法
public override fun toString(): String = “( f i r s t ,   first,  first, second, $third)”
}

// 转换成List集合
public fun  Triple<T, T, T>.toList(): List = listOf(first, second, third)

分析:从上面的源码可以看出,标准库中提供了两个标准的数据类,Pair类以及Triple类.其中:

  • 两个类中都实现了toList()方法以及toString()方法。
  • to()方法乃Pair类特有,作用是参数转换
  • Pair类需要传递两个参数,Triple类需要传递三个参数。

1.5.2、用法

val pair = Pair(1,2)        // 实例
val triple = Triple(1,2,3)  // 实例
println(“KaTeX parse error: Undefined control sequence: \t at position 6: pair \̲t̲ triple”) // 打印:即调用了各自的toString()方法
println(pair.toList())      // 转换成List集合
println(triple.toList())    // 转换成List集合
println(pair.to(3))         // Pair类特有: 其作用是把参数Pair类中的第二个参数替换

输出结果为:

(1, 2)      (1, 2, 3)
[1, 2]
[1, 2, 3]
((1, 2), 3)

二、密封类

密封类是用来表示受限的类继承结构

2.1、什么是受限的类继承结构

  • 所谓受限的类继承结构,即当类中的一个值只能是有限的几种类型,而不能是其他的任何类型。
  • 这种受限的类继承结构从某种意义上讲,它相当于是枚举类的扩展。但是,我们知道Kotlin的枚举类中的枚举常量是受限的,因为每一个枚举常量只能存在一个实例。
  • 但是其和枚举类不同的地方在于,密封类的一个子类可以有可包含状态的多个实例。
  • 也可以说成,密封类是包含了一组受限的类集合,因为里面的类都是继承自这个密封类的。但是其和其他继承类(open)的区别在,密封类可以不被此文件外被继承,有效保护代码。但是,其密封类的子类的扩展是是可以在程序中任何位置的,即可以不在同一文件下。

2.2、关键字

定义密封类的关键字:sealed

声明格式

sealed class SealedExpr()

PS:密封类是不能被实例化的

val mSealedExpr = SealedExpr()  // 这段代码是错误的,编译器直接会报错不能编译通过。

既然密封类是不能实例化,那么我们要怎么使用,或者说它的作用是什么呢?

2.3、作用及用法

2.3.1、作用

用来表示受限的类继承结构。

例:

sealed class SealedExpr{
data class Person(val num1 : Int, val num2 : Int) : SealedExpr()

object Add : SealedExpr()   // 单例模式
object Minus : SealedExpr() // 单例模式
}

// 其子类可以定在密封类外部,但是必须在同一文件中。v1.1之前只能定义在密封类内部
object NotANumber : SealedExpr()

分析:即所定义的子类都必须继承于密封类,表示一组受限的类

2.3.2、和普通继承类的区别

  • 普通的继承类使用open关键字定义,在项目中的类都可继承至该类。
  • 而密封类的子类必须是在密封类的内部或必须存在于密封类的同一文件。这一点就是上面提到的有效的代码保护。

2.3.3、和枚举类的区别

  • 枚举类的中的每一个枚举常量都只能存在一个实例。而密封类的子类可以存在多个实例。

例:

val mPerson1 = SealedExpr.Person(“name1”,22)
println(mPerson1)

val mPerson2 = SealedExpr.Person(“name2”,23)
println(mPerson2)

println(mPerson1.hashCode())
println(mPerson2.hashCode())

输出结果为:

Person(name=name1, age=22)
Person(name=name2, age=23)
-1052833328
-1052833296

2.3.4、子类的类扩展实例

例:

// 其存在于SealedClassDemo.kt文件中
sealed class SealedExpr{
data class Person(val name : String, val age : Int) : SealedExpr()
object Add : SealedExpr()
companion object Minus : SealedExpr()
}

object NotANumber : SealedExpr()

// 其存在TestSealedDemo.kt文件中
fun  SealedExpr.Add.add(num1 : T, num2 : T) : Int{
return 100
}

fun main(args: Array) {
println(SealedExpr.Add.add(1,2))
}

输出结果为:

100

说明:上面的扩展功能没有任何的意义,只是为了给大家展示密封类子类的扩展不局限与密封类同文件这一个功能而已

3.5、使用密封类的好处

  • 有效的保护代码
  • 在使用when表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个else子句了。

例:

sealed class SealedExpr{
data class Person(val name : String, val age : Int) : SealedExpr()
object Add : SealedExpr()
companion object Minus : SealedExpr()
}

object NotANumber : SealedExpr()

fun eval(expr: SealedExpr) = when(expr){
is SealedExpr.Add -> println(“is Add”)
is SealedExpr.Minus -> println(“is Minus”)
is SealedExpr.Person -> println(SealedExpr.Person(“Koltin”,22))
NotANumber -> Double.NaN
}

最后:学习总结——Android框架体系架构知识脑图(纯手绘xmind文档)

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。

下方即为我手绘的Android框架体系架构知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)

除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
兴趣的朋友提供完整的Android框架体系架构知识脑图原件(包括上方的面试解析xmind文档)
[外链图片转存中…(img-5xRRUtgL-1715848765171)]

除此之外,前文所提及的Alibaba珍藏版 Android框架体系架构 手写文档以及一本 《大话数据结构》 书籍等等相关的学习笔记文档,也皆可分享给认可的朋友!

——感谢大家伙的认可支持,请注意:点赞+点赞+点赞!!!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值