object 从字面上理解是对象意思,那么就是创建一个对象。不过在 kotlin 中对象是和类分开。所以其实 object 是先创建一个类,然后实例化这个类的一个对象。请起来有点耳熟,一个只有一个实例的类,那不就是单例。是的我们可以通过 object 来实现单例模式。
再次说明一下 object 产生过程
- 创建类
- 实例化这个类一个对象
如果很好地理解 object 产生过程,随后有关 object 使用场景,以及为什么使用 object 就不难理解了。
object BasicTuts{
val allBasicTut = arrayListOf<Tut>()
var courseAmount = 0
fun getCourse():Int{
for(tut in allBasicTut){
courseAmount+=tut.courses
}
return courseAmount
}
fun add(tut:Tut){
allBasicTut.add(tut)
}
}
BasicTuts.add(Tut("angularjs",10))
BasicTuts.add(Tut("reactjs",12))
println(BasicTuts.getCourse())
object 可以作为一个嵌套类来使用,每种数据类型都有自己的排序的依据,提供一个用于排序的标准Comparator
。而且这个表示规则的比较器应该是类级别的。这个时候我们可以考虑在类中通过 object 来实现。
class Tut(val title:String,val courses:Int){
object TitlComparator : Comparator<Tut>{
override fun compare(o1: Tut, o2: Tut): Int= o1.title.compareTo(o2.title)
}
}
val tutList = listOf<Tut>(Tut("angular",10),Tut("reactjs",12))
println(tutList.sortedWith(Tut.TitlComparator))
object 另一个应用场景就是工厂方法,
class User private constructor(val nickname:String){
companion object {
fun newSubscribingUser(email:String) = User(email.substringBefore('@'))
fun newQQUser(accounId:Int) = User(accounId.toString() +"from QQ")
}
}
fun main() {
val user1 = User.newQQUser(123)
val user2 = User.newSubscribingUser("zidea2015@163.com")
println(user1.nickname)
println(user2.nickname)
}