Kotlin中的静态扩展方法
你如何在Kotlin中定义一个静态的扩展方法? 这甚至有可能吗? 我目前有一个扩展方法如下所示。
public fun Uber.doMagic(context: Context) { // ... }
上面的扩展可以在一个实例上调用。
uberInstance.doMagic(context) // Instance method
但是我如何使它静态方法如下所示。
Uber.doMagic(context) // Static or class method
要实现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对象创build一个静态方法,如下所示:
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) }