Статические методы расширения в Котлине



как вы определяете статический метод расширения в Котлине? Это вообще возможно? В настоящее время у меня есть метод расширения, как показано ниже.



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


вышеуказанное расширение может быть вызвано на экземпляре.



uberInstance.doMagic(context) // Instance method


но как мне сделать это статический метод, как показано ниже.



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

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

    Ничего не найдено.