《Kotlin核心编程》 ——3.5.3 object表达式
3.5.3 object表达式
写Java的时候很多人肯定被它的匿名内部类弄得很烦燥,有时候明明只有一个方法,却要用一个匿名内部类去实现。比如我们要对一个字符串列表排序:
List<String> list = Arrays.asList("redpack", "score", "card");
Collections.sort(list, new Comparator<String>(){
@Override
public int compare(String s1, String s2){
if(s1 == null)
return -1;
if(s2 == null)
return 1;
return s1.compareTo(s2);
}
});
并不是说匿名内部类这个方式不好,只不过方法内掺杂类声明不仅让方法看起来复杂,也不易阅读理解。而在Kotlin中,可以利用object表达式对它进行改善:
val comparator = object : Comparator<String> {
override fun compare(s1: String?, s2: String?): Int {
if (s1 == null)
return -1
else if (s2 == null)
return 1
return s1.compareTo(s2)
}
}
Collections.sort(list, comparator)
简单来看,object表达式跟Java的匿名内部类很相似,但是我们发现,object表达式可以赋值给一个变量,这在我们重复使用的时候将会减少很多代码。另外,我们说过object可以继承类和实现接口,匿名内部类只能继承一个类及实现一个接口,而object表达式却没有这个限制。
用于代替匿名内部类的object表达式在运行中不像我们在单例模式中说的那样,全局只存在一个对象,而是在每次运行时都会生成一个新的对象。
其实我们知道,匿名内部类与object表达式并不是对任何场景都适合的,Java 8引入的Lambda表达式对有些场景实现起来更加适合,比如接口中只有单个方法的实现。而Kotlin天然就支持Lambda表达式,关于Lambda的相关知识可以回顾一下第2章中的内容。现在我们可以将上面的代码用Lambda表达式的方式重新改造一下:
val comparator = Comparator<String> { s1, s2 ->
if (s1 == null)
return@Comparator -1 //我们已经在第2章中接触过这种语法了
else if (s2 == null)
return@Comparator 1
s1.compareTo(s2)
}
Collections.sort(list, comparator)
使用Lambda表达式后代码变得简洁很多。
对象表达式与Lambda表达式哪个更适合代替匿名内部类?
当你的匿名内部类使用的类接口只需要实现一个方法时,使用Lambda表达式更适合;当匿名内部类内有多个方法实现的时候,使用object表达式更加合适。
- 点赞
- 收藏
- 关注作者
评论(0)