kotlin:data,sealed,单例,伴生对象等特殊类形式
数据类
data关键字
格式:
data class Student(val name: String, val id: Int, val age: Int)
优势:自动重写了,equals(),hashCode(),toString()方法。(其中equals只去比较构造器中的val类型参数是否相同,var类型的参数将不影响equals()方法的结果)
密封类
sealed关键字
格式:
sealed class Result
class Success: Result()
class Failure: Result()
优势:密封性,在进行when条件选择时不需要添加else情况
单例类
object关键字
格式:
object Singleton {
fun xx() {
println("ni xx")
}
}
优势:简洁,调用时也只需像java中的静态方法一样使用:Singleton.xx()
伴生对象
companion object关键字
格式:
class Util {
fun xx() {
println("ni xx")
}
companion object {
//方法可与外部的同名
fun xx() {
println("wo xx")
}
}
}
优势:如同前面的单例类一样,调用方便Util.xx(),而单例对象毕竟是将所有的方法都变成类似于java中静态方法的调用方式,而伴生对象则可将部分方法变成静态方法调用方式
静态方法
@JvmStatic关键字
格式:
class Util {
companion object {
@JvmStatic
fun xx() {
println("wo xx")
}
}
}
优势:上面讲的单例也好伴生对象也好,都不是真正的等同于java静态方法,我们可以通过加@JvmStatic注解的方法来实现(除了伴生对象的方法可以加,单例类的方法也可加)
顶层函数
或者叫顶层方法,其实和“@JvmStatic关键字”一样也是实现java静态方法的一种手段。
const关键字
将到静态方法不得不提一下const关键字,它实现了java中静态常量的作用。
实际上应该称其为const val关键字,因为const只能修饰val。
还有就是const只允许在top-level级别和object中声明
格式:
const val NI_XX = "ni xx"
object Singleton {
const val NI_XX = "ni xx"
}
const val 和 val 的区别:https://www.jianshu.com/p/01aac645d003这篇文章介绍的详细又简洁,不过仍有些疑问如果说单独val的字节码为private的,那我在val前面添加public修饰符,则又会提示该修饰符多余。难道说kotlin的字节码中字段的可见域又和我们编写代码时不同吗?(当然如同文章中表示的那样会自动生成get方法,使得实际效果和我们想要的一样)我不清楚java类语言是否都有如此共性,还是kotlin与众不同的编译解释手法。