抓住今天,尽可能少的信赖明天。 喝汤能补 (* ^ ▽ ^ *)
前言
该文章作为学习交流,如有错误欢迎各位大佬指正 (* ^ ▽ ^ *)
- 自身技能
(1)已具备计算机的基本知识 - 本文简介
主要讲解:变量,类的访问权限修饰符;kotlin中特有的数据类和密封类;以及设计模式中的单例类。
可见性修饰符
kotlin中,四种修饰符:public、private、protected 和 internal ,这些修饰符直接加在fun关键字前即可。
java与kotlin修复符的对比
修饰符 | java | kotlin |
---|---|---|
public | 所有类可见 | 所有类可见(默认) |
private | 当前类可见 | 当前类可见 |
protected | 当前类、子类、同一包路径下的类可见 | 当前类,子类可见 |
default | 同一包路径下的类可见(默认) | 无 |
internal | 无 | 同一模块中的类可见 |
数据类
我们与数据库,服务器进行交互时,需要将它们包含的数据映射到内存中,为编程逻辑提供数据模型的支持。
数据类通常要重写equals(),hashCode(),toString()这几个方法。
- equals() 判断两个数据类是否相等。
- hashCode() 作为equals的配套方法,进行重写(否则导致HashMap、HashSet等 -hash相关系统类无法正常使用)。
- toString() 将会数据类中的所有的字段以及值通过字符串形式拼接到一起,提供清晰的输入日志,方便快速查看字段的值是否正确。若该方法未重写,则默认打印的就是内存地址。
语法 data关键字
数据类,会根据主构造函数中的参数将equls(),toString()等方法自动生成。当一个类中没有代码时,可以省略尾部的大括号。
一个登录类
data class Login(val name: String, val pawss: String)
fun main() {
val login = Login("aa","aaa")
val login1 = Login("aa","aaa")
println(login)
println(" ? "+ (login == login1))
}
运行结果
Login(name=aa, pawss=aaa)
? true
单例类
单例指的就是设计模式中单例模式,用于避免创建重复的对象。
语法 object 类名
虽然使用方式与静态方法调用相似,但实际上,Kotlin自动帮我们创建了一个实例,并保证全局只会存在一个实例。
object Singleton {
fun test(){
println(" singleton test! ")
}
}
使用
Singleton.test()
密封类
语法关键字,密封类的作用是,指定子类的类型为特定的几种class,其子类是有限的class。
- 密封类及其所有子类只能定义在同一个文件的顶层位置(.kt文件),不能嵌套在其他类中,这时密封类底层的实现机制所限制的。
简单的使用例子:如果我们定义一个Result.kt的接口,在定义一个 getResultMsg方法。这里因为kotlin语法,我们需要编写一个else让代码通过编译,虽然知道没有这种情况发生。假如后面,扩展了Result接口,增加了一个Unknow类,也是继承Result的,那么如果没有更新when语句的代码,则会抛出异常。
这里我们将接口关键字,换成sealed class,这时kotlin会自动根据子类的限制,强制要求将所有的子类条件处理完,即可无需编写else分支。如果增加Unknown类,该when语句出也会报错,必须增加Unknown的条件分支才能编译过。
interface Result
class Success(val msg: String): Result
class Failure(val error: Exception): Result
fun getResultMsg(result: Result) = when(result){
is Success ->result.msg
is Failure ->result.error.message
else -> throw IllegalAccessException()
}
sealed class Result
class Success(val msg: String): Result()
class Failure(val error: Exception): Result()
fun getResultMsg(result: Result) = when(result){
is Success ->result.msg
is Failure ->result.error.message
}
(* ^ ▽ ^ *)