首页 文章

Kotlin中的静态扩展方法

提问于
浏览
105

如何在Kotlin中定义静态扩展方法?这甚至可能吗?我目前有一个扩展方法,如下所示 .

public fun Uber.doMagic(context: Context) {
    // ...
}

可以在实例上调用上述扩展名 .

uberInstance.doMagic(context) // Instance method

但是如何使它成为静态方法,如下所示 .

Uber.doMagic(context)         // Static or class method

5 回答

  • 5

    要实现 Uber.doMagic(context) ,您可以编写companion objectcompanion object的扩展名(需要伴随对象声明):

    class Uber {
        companion object {}
    }
    
    fun Uber.Companion.doMagic(context: Context) { }
    
  • 0

    这是官方文件说的:

    Kotlin为包级函数生成静态方法 . 如果您将这些函数注释为@JvmStatic,Kotlin还可以为命名对象或伴随对象中定义的函数生成静态方法 . 例如:

    Kotlin static methods

    class C {
      companion object {
        @JvmStatic fun foo() {}
        fun bar() {}
      }
    }
    

    现在,foo()在Java中是静态的,而bar()不是:

    C.foo(); // works fine
    C.bar(); // error: not a static method
    
  • 99

    您可以使用Companion对象创建静态方法,如:

    class Foo {
        // ...
        companion object {
            public fun bar() {
                // do anything
            }
        }
    }
    

    然后你可以这样称呼它:

    class Baz {
        // ...
        private fun callBar() {
            Foo.bar()
        }
    }
    
  • -2

    建议你看看this链接 . 正如你在那里看到的那样,你应该在包(文件)的顶层声明方法:

    package strings
    public fun joinToString(...): String { ... }
    

    这等于

    package strings;
    
    public class JoinKt {
        public static String joinToString(...) { ... }
    }
    

    使用constans一切都是一样的 . 这个宣言

    val UNIX_LINE_SEPARATOR = "\n"
    

    等于

    public static final String UNIX_LINE_SEPARATOR = "\n";
    
  • 9

    我也非常喜欢在Kotlin中添加静态扩展方法 . 作为一种解决方法,我现在将exntension方法添加到多个类中,而不是在所有类中使用一个静态扩展方法 .

    class Util    
    
    fun Util.isDeviceOnline(context: Context): Boolean {
        val connMgr = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = connMgr.activeNetworkInfo
        return networkInfo != null && networkInfo.isConnected
    }
    
    fun Activity.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) }
    fun OkHttpClient.isDeviceOnline(context: Context) = { Util().isDeviceOnline(context) }
    

相关问题