《Kotlin核心编程》 ——3.5.3 object表达式

举报
华章计算机 发表于 2020/02/21 23:13:05 2020/02/21
【摘要】 本节书摘来自华章计算机《Kotlin核心编程》 —— 书中第3章,第3.5.3节,作者是水滴技术团队 。

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表达式更加合适。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。