• Kotlin 伴生对象(companion object) VS 包函数


    Kotlin的伴生对象(companion object)在语法上类似于Java中的静态方法,所以很多人也都是这样用的。本文将向你展示伴生对象的工作方式和在Kotlin中创建静态方法的推荐做法。

    伴生对象 Companion Objects

    是一个在类内部声明的用 companion 关键字标记的对象。在语法上它类似于Java中的静态方法:你可以通过类名调用对象内的成员。

    代码一般是这样的:

    1. // 声明
    2. class KCompanion {
    3. companion object{
    4. fun getBongs(nTimes: Int) {
    5. for (i in 1 .. nTimes) {
    6. print("BONG ")
    7. }
    8. }
    9. }
    10. }
    11. // 调用
    12. KCompanion.getBongs()

    相当简单对吧!即使伴生对象的成员在其他语言中看起来像是静态成员,在运行时他们仍然是真实对象的成员实例。

    我们看看代码编译后发生了什么:

    1. public final class KCompanion {
    2. ...
    3. public static final class Companion {
    4. public final void getBongs(int nTimes) {
    5. ...
    6. }
    7. }
    8. }

    一个额外的Companion类 被创建出来了。如何避免创建这个类呢?我们可以使用包可见级别的函数来实现我们的需求。

    包函数 Package-Level Functions

    创建一个kotlin文件 Bong.kt,然后写我们想要作为静态的在项目各处都可访问的方法:

    1. fun getBongs(nTimes: Int) {
    2. for (i in 1 .. nTimes) {
    3. print("BONG ")
    4. }
    5. }
    6. fun someOtherMethod() {
    7. print("BONG ")
    8. }

    这样就可以直接访问包可见函数,不需要使用任何限定符:

    1. // 调用全局函数
    2. getBongs(5)

    我们看看这段代码编译后的代码是什么样的:

    1. public final class BongKt {
    2. public static final void getBongs(int nTimes) {
    3. ...
    4. }
    5. public static final void someOtherMethod() {
    6. ...
    7. }
    8. }

    可以看到,编译后的代码没有创建额外的类。

    总结:如果可以的话,当你想使用伴生对象 companion object 时,考虑使用包函数替代~

  • 相关阅读:
    【Vue】params和query的区别?实战两种路由传参方式
    11、IOC 之使用 JSR 330 标准注释
    哨兵模式及其搭建
    Day662.分析定位Java问题工具② -Java业务开发常见错误
    基于JavaSwing开发中国象棋对战游戏+实验报告 课程设计 大作业
    Qt插件开发_入门教程
    java面向对象(八)
    033——常见数据结构
    夜神模拟器+Fiddler抓包测试App
    Git常用命令归纳
  • 原文地址:https://blog.csdn.net/mg2flyingff/article/details/125511612