¿Cuál es el equivalente de los methods estáticos de Java en Kotlin?

No hay palabra key static en Kotlin.

¿Cuál es la mejor manera de representar un método Java static en Kotlin?

Usted coloca la function en el "object acompañante".

Así que el código de Java así:

 class Foo { public static int a() { return 1; } } 

se convertirá

 class Foo { companion object { fun a() : Int = 1 } } 

Puede usarlo desde el código de Kotlin como

 Foo.a(); 

Pero desde el código de Java necesitarás llamarlo como

 Foo.Companion.a(); 

(Que también funciona desde dentro de Kotlin).

Si no le gusta tener que especificar el bit Companion , puede agregar una anotación @JvmStatic o @JvmStatic un nombre a su class complementaria.

De los documentos :

Objetos acompañantes

Una statement de object dentro de una class se puede marcar con la palabra key complementaria:

 class MyClass { companion object Factory { fun create(): MyClass = MyClass() } } 

Los miembros del object acompañante se pueden llamar utilizando simplemente el nombre de la class como calificador:

 val instance = MyClass.create() 

Sin embargo, en la JVM puede tener miembros de objects complementarios generados como campos y methods estáticos reales, si usa la anotación @JvmStatic . Vea la sección de interoperabilidad de Java para más detalles.

Agregar la anotación @JvmStatic ve así

 class Foo { companion object { @JvmStatic fun a() : Int = 1; } } 

y luego existirá una function estática real de Java, accesible tanto desde java como kotlin como Foo.a() .

Si simplemente no le gusta el nombre del Companion , también puede proporcionar un nombre explícito para el object complementario que se ve así:

 class Foo { companion object Blah { fun a() : Int = 1; } } 

que te permitirá llamarlo desde Kotlin de la misma manera, pero desde Java como Foo.Blah.a() (que también funcionará en Kotlin).

Docs recomienda resolver la mayoría de las necesidades de funciones estáticas con funciones de nivel de package . Simplemente se declaran fuera de una posada de class un file de código fuente. El package de un file se puede especificar al comienzo de un package con la palabra key package.

Declaración

 package foo fun bar() = {} 

Uso

 import foo.bar 

Alternativamente

 import foo.* 

Ahora puede llamar a la function con:

 bar() 

o si no usa la palabra key import:

 foo.bar() 

Si no especifica el package, se podrá acceder a la function desde la raíz.

Si solo tienes experiencia con Java, esto puede parecer un poco extraño. La razón es que kotlin no es un lenguaje estrictamente orientado a objects. Podría decir que admite methods fuera de las classs.

Use object para representar val / var / method para hacer static. También puede usar object en lugar de singleton class. Puedes usar companion si quieres hacer static dentro de una class

 object Abc{ fun sum(a: Int, b: Int): Int = a + b } 

1. Definir :

Cualquier method/ val/ var dentro del object (palabra key para Singleton ) actuará como estático en java.

Use un companion object si desea llamar a un método simplemente usando la class que contiene el object.

 object Foo{ fun sayFoo() = println("Foo") val bar ="bar" } 

2. Uso:

 Foo.sayFoo() println(Foo.bar) 

3. Salida:

 Foo bar 

Debe pasar el object complementario para el método estático porque kotlin no tiene palabra key estática: los miembros del object complementario pueden invocarse utilizando simplemente el nombre de la class como calificador:

 package xxx class ClassName { companion object { fun helloWord(str: String): String { return stringValue } } } 

Escríbelas directamente a los files.

En Java (feo):

 package xxx; class XxxUtils { public static final Yyy xxx(Xxx xxx) { return xxx.xxx(); } } 

En Kotlin:

 @file:JvmName("XxxUtils") package xxx fun xxx(xxx: Xxx): Yyy = xxx.xxx() 

Esos dos códigos se igualan después de la compilation (incluso el nombre del file comstackdo, el file:JvmName se utiliza para controlar el nombre del file comstackdo, que debe colocarse justo antes de la statement del nombre del package).

  • ControlsFX SpreadsheetView rowspan IndexOutOfBoundsException
  • Error de complemento: Kotlin lanzó una NoReadAccessException no detectada
  • Los elementos de vista de Android NavigationView Headerlayout no están activando events de clic
  • El complemento Anko no se puede ejecutar en la versión de Androidstudio> 2.1
  • ¿Cómo obtengo la identificación del documento de Firestre utilizando las classs de datos de kotlin?
  • Soporte de macros en herramientas
  • kotlin trabaja con Recursos (matriz y parámetro de function)
  • Compruebe si la class es un valor válido para KParameter
  • Definición recursiva de secuencia infinita en Kotlin
  • Kotlin usando cuando por condiciones simples
  • ¿Cómo se pueden agregar methods estáticos a las classs de Java en Kotlin?