Kotlin 类型进阶 | 七日打卡

Kotlin 类型进阶 | 七日打卡

Android小彩虹2021-07-16 4:10:3270A+A-

一、前言

Kotlin 泛型(上) 中我们已经将 Kotlin 的 泛型基础 讲完了,想要学习泛型进阶,我们要先了解几个类。

二、数据类 data class

2.1、数据类的定义

只需要在一个普通类的前面加一个 data,普通类就变成了数据类了,可以将它和 Java 的 JavaBean 做类比,如下:

data class Book(val id: Long, val name: String, val author: Person) 

上面代码中定义在柱构造器中的属性又称为 component,可以通过调用 book.component 方法获取到构造器中属性的值。

val id = book.component1()
val name = book.component2()
val author = book.component3()

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

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

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

2.2、JavaBean vs data class

JavaBean data class
构造方法 默认无参构造 属性作为参数
字段 字段私有,Getter/Setter 公开 属性
继承性 可继承也可被继承 不可被继承
component 想等性、解构等

2.3、如何合理的使用 data class

我们先来看一下 data class 的性质,如下: data class

通过上图我们知道我们应该把 data class 当成一个数据结构来使用,不需要额外的实现,并且属性类最好是基本类型和不可变的来保证 data class 不产生逻辑。

三、枚举类 enum class

3.1、枚举的定义

Java:

enum State {
	Idle, Busy
}

// 通过 name 方法返回名字 Idle
State.Idle.name()
// 通过 ordinal 返回序号 0
State.Idle.ordinal()

Kotlin:

enum class State {
	Idle, Busy
}

// 通过 name 方法返回名字 Idle
State.Idle.name
// 通过 ordinal 返回序号 0
State.Idle.ordinal

四、密封类 sealed class

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

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

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

4.1、密封类的概念

  • 密封类是一种特殊的抽象类;
  • 密封类的子类定义在与自身相同的文件中;
  • 密封类的子类的个数是有限的。

4.2、密封类的定义

sealed class PlayerState {
	// 构造器私有
	constructor()
	constructor(int: Int)
}

五、内联类 inline class

  • 内联类是对某一个类型的包装;
  • 内联类是类似于 Java 装箱类型的一种类型;
  • 编译器会尽可能使用包装的类型进行优化。

5.1、内联类的定义

// 包装 Int 类型,必须是 val
inline class BoxInt(val value: Int) 

5.2、内联类的方法

inline class BoxInt(val value: Int) {
	operator fun inc(): BoxInt {
	    return BoxInt(value + 1)
	}
}

5.3、内联类的继承结构

内联类可以实现接口,但不能继承父类也不能被继承。

// 实现接口是可以的
inline class BoxInt(val value: Int): Comparable<Int> {
	override fun compareTo(other: Int) = value.compareTo(other)
}

六、源码

源码 已上传至 github,有需要可以直接下载。

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1

联系我们