ec1bbcfdbbf2f3d009222008e65159b7.png

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提示转换就行

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐