Статические методы расширения в Котлине
как вы определяете статический метод расширения в Котлине? Это вообще возможно? В настоящее время у меня есть метод расширения, как показано ниже.
public fun Uber.doMagic(context: Context) {
// ...
}
вышеуказанное расширение может быть вызвано на экземпляре.
uberInstance.doMagic(context) // Instance method
но как мне сделать это статический метод, как показано ниже.
Uber.doMagic(context) // Static or class method
6 ответов:
достижения
Uber.doMagic(context), вы можете написать расширение для компаньон объекта наUber(требуется объявление сопутствующего объекта):class Uber { companion object {} } fun Uber.Companion.doMagic(context: Context) { }
вот что говорится в официальной документации:
Kotlin генерирует статические методы для функций уровня пакета. Котлин может также генерировать статические методы для функций, определенных в именованных объекты или сопутствующие объекты, если вы аннотируете эти функции как @JvmStatic. Например:
class C { companion object { @JvmStatic fun foo() {} fun bar() {} } }теперь, foo() является статическим в Java, в то время как bar () не является:
C.foo(); // works fine C.bar(); // error: not a static method
вы можете создать статический метод с помощью сопутствующего объекта, например:
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(...) { ... } }с константами все то же самое. Это заявление
val UNIX_LINE_SEPARATOR = "\n"равна
public static final String UNIX_LINE_SEPARATOR = "\n";
Я тоже очень люблю иметь возможность добавлять статические методы расширения в Котлин. В качестве обходного пути на данный момент я добавляю метод 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) }
Если вы следуете стилю написания статики в верхней части класса на Java, то я предлагаю попробовать написать их на верхнем уровне (например, перед объявлением класса) в Котлине. Для многих случаев использования он работает лучше, чем введение сопутствующего объекта
Пример Кода:
class Person { companion object Test { fun callMe() = println("I'm called.") } } fun main(args: Array<String>) { Person.callMe()}при запуске программы, вывод будет:
меня зовут.
Comments