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