kotlin-Explicación detallada de varias formas de lograr estática

https://www.jianshu.com/p/a5b0da8bbba3
compila kotlin en java

Primero, hagamos una digresión, ¿cómo miramos el código java correspondiente a kotlin? Kotlin eventualmente será compilado en una clase java para ejecutarse en la JVM. A veces realmente queremos ver cómo se ve el código escrito en kotlin después de ser compilado. Ayúdanos a comprender la sintaxis de Kotlin

En realidad, es muy simple. Se proporcionan herramientas AS

  1. herramientas -> Mostrar código de bytes kotlin

     

     

  2. Haga clic en Descompilar

     

     

Vale eso es todo


kotlin implementa una forma estática

En realidad, no existe el concepto de Java estático en el lenguaje kotin. Básicamente, se utiliza un objeto estático para simular las propiedades estáticas y los métodos de la clase. Actualmente hay 4 formas de implementarlo:

  • objeto complementario -objeto complementario, la forma de declarar un singleton
  • @JvmField + @JvmStatic anotación: use la etiqueta de anotación para declarar la parte estática
  • objeto singleton -estático singleton es en realidad similar al objeto compañero
  • const -uniqueness en el paquete, libre de las restricciones de clases, las características de kotlin, serán compiladas en java para generar un archivo kotlin.kt para proporcionar soporte de alineación especial

objeto compañero

Objeto complementario Objeto complementario Este es el método más utilizado en Kotlin. En el objeto complementario, podemos declarar atributos y métodos. El método de llamada en Kotlin se siente igual que estático en Java. Por ejemplo, consulte lo siguiente:

 

class BookKotlin {

    var name: String = "AA"

    fun speak() {}

    companion object instance {

        var nameStatic: String = "BB"

        fun speakStatic() {}

    }
}

Usado en kotlin de la siguiente manera:

 

Llamar a métodos y propiedades estáticos en kotlin

 

 

Llamar a los métodos y propiedades de los miembros en kotlin

Mirando la imagen de arriba, cuando lo usamos en kotlin, sentimos que de hecho es lo mismo que estático en java. El método de parámetro estático y el método de parámetro de miembro se pueden distinguir efectivamente. Echemos un vistazo al uso en java.

Usado en Java de la siguiente manera:

 

Nombre de la clase. No hay propiedades y métodos estáticos, solo un objeto estático

 

Bajo este objeto estático, podemos encontrar las propiedades estáticas y los métodos que declaramos

 

nuevo un objeto podemos usar variables miembro y métodos

El uso de kotlin está bien, pero todo cambia cuando se trata de java. Por qué, dado que kotlin eventualmente se compilará en archivos java y se ejecutará en JVM, kotlin no proporciona su propia VM única, por lo que el código kotlin aún debe convertirse en código java Sí, o cómo anuncia kotlin que kotlin y java se pueden llamar sin problemas

Todas las variables miembro en kotlin, ya sean estáticas o no, tienen métodos get / set. Además, kotlin no declara los parámetros y métodos estáticos que declaramos como estáticos, sino que se usa en tránsito a través de la instancia del objeto estático, lo que permite. Estamos desconcertados ¿Qué pasará con Kotlin después de que se convierta en Java? ¿Será diferente de nuestra intención original y afectará nuestro uso?

El nombre de la instancia del objeto estático es el nombre seguido del objeto complementario, que puede omitirse. Si no lo escribe, el valor predeterminado es INSTANCE (la versión puede cambiar)

Echemos un vistazo convirtiendo kotlin en código java

Convierta el código kotlin a java:

 

public final class BookKotlin {

   private static String nameStatic = "BB";

   public static final BookKotlin.instance instance = new BookKotlin.instance((DefaultConstructorMarker)null);

   private String name = "AA";

   public final String getName() {
      return this.name;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.name = var1;
   }

   public final void speak() {
   }

   public static final class instance {
      @NotNull
      public final String getNameStatic() {
         return BookKotlin.nameStatic;
      }

      public final void setNameStatic(@NotNull String var1) {
         Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
         BookKotlin.nameStatic = var1;
      }

      public final void speakStatic() {
      }

      private instance() {
      }

      // $FF: synthetic method
      public instance(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}

Después de ver el código java, todo el mundo está completamente claro. El objeto complementario no es en vano, en realidad es un objeto. Agregue un objeto de implementación de clase interna estática de la clase final estática dentro de la clase para simular características estáticas


@JvmField + @JvmStatic anotación

Hemos visto el objeto complementario del objeto complementario anterior. Entonces, ¿Kotlin realmente no puede lograr la estática? No, Kotlin todavía proporciona métodos relacionados. Esta es la anotación @JvmField + @JvmStatic, lo que significa que los miembros y métodos se declaran utilizando la Característica proporcionada por JVM

  • @JvmField - Decora variables estáticas
  • @JvmStatic - Decora métodos estáticos
  • @JvmField y @JvmStatic solo se pueden escribir en clases modificadas por objetos u objetos complementarios. Aunque la escritura es un poco incómoda, el efecto se logra realmente mediante estática

Modificamos el código anterior:

 

class BookKotlin {

    companion object {

        @JvmField
        var nameStatic: String = "BB"

        @JvmStatic
        fun speakStatic() {
        }
    }

    var name: String = "AA"

    fun speak() {}
}

Usado en kotlin de la siguiente manera:

 

 

Usado en Java de la siguiente manera:

 

 

 

Convierta el código kotlin a java:

 

public final class BookKotlin {

   @JvmField
   public static String nameStatic = "BB";

   @JvmStatic
   public static final void speakStatic() {
      Companion.speakStatic();
   }

   public static final BookKotlin.Companion Companion = new BookKotlin.Companion((DefaultConstructorMarker)null);

   private String name = "AA";

   @NotNull
   public final String getName() {
      return this.name;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      this.name = var1;
   }

   public final void speak() {
   }


   public static final class Companion {
      @JvmStatic
      public final void speakStatic() {
      }

      private Companion() {
      }

      // $FF: synthetic method
      public Companion(DefaultConstructorMarker $constructor_marker) {
         this();
      }
   }
}


objeto singleton

El propio Kotlin proporciona una implementación singleton: object, que se usa directamente para modificar la clase. Una clase modificada con object no puede ser un objeto nuevo, sino que solo puede usar el singleton proporcionado por object

 

object BookKotlin {

    var name: String = "AA"

    fun speak() {}
}

Usado en kotlin de la siguiente manera:

 

 

 

Las clases de objetos modificados ya no pueden crear objetos

Usado en Java de la siguiente manera:

 

 

 

Convierta el código kotlin a java:

 

public final class BookKotlin {

   private static String name;
   public static final BookKotlin INSTANCE;

   public final String getName() {
      return name;
   }

   public final void setName(@NotNull String var1) {
      Intrinsics.checkParameterIsNotNull(var1, "<set-?>");
      name = var1;
   }

   public final void speak() {
   }

   static {
      BookKotlin var0 = new BookKotlin();
      INSTANCE = var0;
      name = "AA";
   }
}

Aunque el nombre es estático, sigue siendo privado y la llamada debe transferirse a través de un singleton estático, que en realidad es un singleton.


constante

const se escribe fuera de la clase, el efecto = @JvmField, pero no puede modificar el método, ni se puede mezclar con @JvmField. Generalmente se usa para declarar valores de uso común. No es muy útil y solo puede usar val. Var no es bueno. Si desea modificar el método, simplemente no escriba const

 

const val name: String = "AA"
fun adk(){}
class BookKotlin {

    fun speak() {}
}

Se usa en kotlin de la siguiente manera:
kotlin no tiene el concepto de paquete, por lo que se usa directamente. Tenga en cuenta que escribir de esta manera es en realidad equivalente a dejar el alcance de la clase, y el nombre no se puede duplicar dentro del alcance de un paquete

 

 

 

Usado en Java de la siguiente manera:

 


Este archivo BookKotlinKt es una clase auxiliar generada específicamente para admitir esta característica de Kotlin. En Java, usamos esta clase para llamar al contenido de la declaración const. ¿Por qué necesitamos esta clase? Porque Java tiene el concepto de un paquete, todo El archivo debe tener una especificación de dirección unificada, por lo que el nivel kotlin solo puede proporcionar archivos XXXKt para admitirlo solo, de hecho, esto está fuera del alcance de java

 

Convierta el código kotlin a java:

 

public final class BookKotlin {
   public final void speak() {
   }
}

public final class BookKotlinKt {
   @NotNull
   public static final String name = "AA";

   public static final void adk() {
   }
}

En el código java, existe como una clase auxiliar de Kotlin, por lo que realmente hay muy pocas personas que lo usan, lo cual es demasiado restrictivo.



Autor: turtle reenvíe el
enlace: https: //www.jianshu.com/p/a5b0da8bbba3
Fuente: Los libros de Jane
tienen derechos de autor del autor. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/az44yao/article/details/113111115
Recomendado
Clasificación