Kotlin中的静态扩展方法

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

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

上面的扩展可以在一个实例上调用。

 uberInstance.doMagic(context) // Instance method 

但是我如何使它静态方法如下所示。

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

    5 Solutions collect form web for “Kotlin中的静态扩展方法”

    要实现Uber.doMagic(context) ,你可以写一个扩展到Uber的伴侣对象(需要伴随对象声明):

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

    这是官方文件说的:

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

    Kotlin静态方法

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

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

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

    您可以使用Companion对象创建一个静态方法,如下所示:

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

    然后你可以这样称呼它:

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

    推荐你看看这个链接。 正如你所看到的那样,你只需要在包(文件)的顶层声明方法:

     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"; 

    我也非常喜欢在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) } 
    Kotlin language will be the best programming language for Android.