1. 伴生对象companion object
伴生对象是相较于一个类而言的,意为伴随某个类的对象,它属于这个类所有,与java中static修饰的一样,全局只有一个单例,声明在类的内部,在类被装载时会被初始化(与static初始化一致)
companion object大括号内包裹了所有静态属性及静态方法,分离更加清晰
data class Person(val name: String, val sex: String) {
companion object {
val MALE = "m"
val FEMALE = "f"
fun isMale(person: Person): Boolean {
return MALE == person.sex
}
}
}
fun main() {
val person = Person("lilei", "m")
val isMale = Person.isMale(person)//true
}
另一个用法,工厂构造设计模式应用
data class Person(val name: String, val sex: String) {
companion object {
val MALE = "m"
val FEMALE = "f"
fun isMale(person: Person): Boolean {
return MALE == person.sex
}
fun newMale(name: String): Person {
return Person(name, MALE)
}
fun newFemale(name: String): Person {
return Person(name, FEMALE)
}
}
}
2.单例
object HttpConfig {
var host: String = "https://127.0.0.1"
var port: Int = 8080
}
//可直接修改
HttpConfig.host="https://192.168.123.1"
3.object表达式
代替java中的匿名内部类
Collections.sort(mutableListOf(1, 5, 7, 2), object : Comparator<Int> {
override fun compare(o1: Int, o2: Int): Int {
return o1 - o2;
}
})
//这种情况下idea会提示可转换成lamba表达式,转换后变成以下样式
Collections.sort(mutableListOf(1, 5, 7, 2)) { o1, o2 -> o1 - o2; }
以上使用看不出特点,直接使用lamba更加方便,其实object表达式还有一个最重要的特点:可以继承类和实现多个接口而lamba表达式只能实现一个接口
所以在需要继承类或者实现多个接口时可以考虑使用object表达式,或者单独定义一个类,其余时候按idea提示转换就行