variable method estaticas estatica static-methods kotlin

static-methods - method - variable estatica en kotlin



Métodos de extensión estática en Kotlin (6)

Esto es lo que dice la documentación oficial:

Kotlin genera métodos estáticos para las funciones de nivel de paquete. Kotlin también puede generar métodos estáticos para funciones definidas en objetos nombrados u objetos complementarios si anota esas funciones como @JvmStatic. Por ejemplo:

Métodos estáticos de Kotlin

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

Ahora, foo () es estático en Java, mientras que bar () no es:

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

¿Cómo se define un método de extensión estática en Kotlin? ¿Esto es posible? Actualmente tengo un método de extensión como se muestra a continuación.

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

La extensión anterior se puede invocar en una instancia.

uberInstance.doMagic(context) // Instance method

pero ¿cómo lo hago el método estático como se muestra a continuación?

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


Para lograr Uber.doMagic(context) , puede escribir una extensión al objeto complementario de Uber (se requiere la declaración del objeto complementario):

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


Puede crear un método estático con el uso de un objeto Companion como:

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

y luego puedes llamarlo así:

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


Si sigues el estilo de escribir las estáticas en la parte superior de la clase en Java, entonces sugiero tratar de considerar escribirlas en el nivel superior (por ejemplo, antes de la declaración de la clase) en Kotlin. Para muchos casos de uso, funciona mejor que la introducción de un objeto complementario

Código de muestra:

class Person { companion object Test { fun callMe() = println("I''m called.") } } fun main(args: Array<String>) { Person.callMe()}

Cuando ejecutas el programa, el resultado será:

Me llaman.


También me gusta mucho tener la posibilidad de agregar métodos de extensión estáticos en Kotlin. Como solución alternativa, ahora estoy agregando el método de extensión a múltiples clases en lugar de usar un método de extensión estático en todas ellas.

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) }


Te recomiendo que mires this enlace. Como puede ver allí, solo debe declarar el método en el nivel superior del paquete (archivo):

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

Esto es igual a

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

Con constantes, todo es lo mismo. Esta declaración

val UNIX_LINE_SEPARATOR = "/n"

es igual a

public static final String UNIX_LINE_SEPARATOR = "/n";