¿Cómo define un método de extensión estática en Kotlin? ¿Es esto 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 método estático como se muestra a continuación.
Uber.doMagic(context) // Static or class method
static-methods
kotlin
Ragunath Jawahar
fuente
fuente
Respuestas:
Para lograrlo
Uber.doMagic(context)
, puede escribir una extensión al objeto complementario deUber
(se requiere la declaración del objeto complementario):fuente
Esto es lo que dice la documentación oficial:
Métodos estáticos de Kotlin
fuente
De hecho, tuve esta pregunta exacta hace 30 minutos, así que comencé a investigar y no pude encontrar ninguna solución o solución para esto, PERO mientras buscaba encontré esta sección en el sitio web de Kotlinglang que dice que:
Entonces tuve la idea más loca de todas, ¿por qué no definir una función de extensión con un receptor anulable (sin usar ese receptor) y luego llamarlo en un objeto nulo! Así que lo intenté y funcionó bastante bien, pero se veía tan feo. Fue así:
Así que hice eso creando un val en mi archivo de extensiones del tipo de receptor que tenía un valor nulo y luego lo usé en mi otra clase. Entonces, como ejemplo, así es como implementé una función de extensión "estática" para la
Navigation
clase en Android: En mi archivo NavigationExtensions.kt:En el código que lo usa:
Obviamente, este no es un nombre de clase, es solo una variable del tipo de clase que tiene un valor nulo. Esto es obviamente feo en el lado del creador de extensiones (porque tienen que crear la variable) y en el lado del desarrollador (porque tienen que usar el
SType
formato en lugar del nombre de la clase real), pero es lo más cercano que se puede lograr en este momento en comparación con las funciones estáticas reales. Con suerte, los creadores de idiomas de Kotlin responderán al problema que se creó y agregarán esa característica en el idioma.fuente
Puede crear un método estático con el uso de objetos complementarios como:
y luego puedes llamarlo así:
fuente
platformStatic
anotación.platformStatic
fue renombradoJvmStatic
en Kotlin actual.Te recomiendo que mires este enlace. Como puede ver allí, solo debe declarar el método en el nivel superior del paquete (archivo):
Esto es igual a
Con constantes todo es igual. Esta declaración
es igual a
fuente
También me gusta mucho tener la posibilidad de agregar métodos de extensión estática en Kotlin. Como solución alternativa por ahora, estoy agregando el método de extensión a varias clases en lugar de usar un método de extensión estática en todas ellas.
fuente
Activity.isDeviceOnline(...)
sin tener una instancia deActivity
.Para crear un método de extensión en kotlin, debe crear un archivo kotlin (no una clase) y luego declarar su método en el archivo Por ejemplo:
Importe la función en la clase o archivo en el que está trabajando y utilícela.
fuente