Clase JvmInline (en línea) en Kotlin: lo que puede y no puede hacer | por Ade Freudta

Foto de Luke Thornton en UnsplashSi te acabas de enterar Clase JvmInline (en línea)puede leer los siguientes artículos: Veamos qué puede y no puede hacer JvmInline (en línea) con una vista previa del código.
Contenidos
Csolo puede ser final y no puede ser abierto o abstracto
// Correct@JvmInlinevalue class ExampleInline(private val value: String)// Incorrect@JvmInlineopen value class ExampleInline(private val value: String)// Incorrect@JvmInlineabstract value class ExampleInline(private val value: String)
Cuna extensión a interfaz pero no puede extenderse a otro Clase
clase abierta ExampleClassinterface ExampleInterface// Correct@JvmInlinevalue class ExampleInline(private val value: String) : ExampleInterface// Correct@JvmInlinevalue class ExampleInline(private val value: ExampleInterface) : ExampleInterface by value// Incorrect@JvmInlinevalue class ExampleInline(private val value: String): clase de ejemplo
CSolo tienen una propiedad inmutable (ya sea pública o privada) y no pueden tener propiedades mutables o múltiples propiedades.
// Correct@JvmInlinevalue class ExampleInline(// Un valor privado inmutable de valor de propiedad privada: String) // Correct@JvmInlinevalue class ExampleInline(// Un valor público inmutable de propertyval: String)// Incorrect@JvmInlinevalue class ExampleInline(// Un valor privado mutable propertyprivate var value: String)// Incorrect@JvmInlinevalue class ExampleInline(// Multiple private mutable propertyprivate var value1: String,private val value2: String)
Puede declarar propiedades, pero cy no tienen propiedades con campos de fondo.
@JvmInlinevalue class ExampleInline(private val value: String) { // Correctval length: Intget() = value.length// False// Value class no puede tener propiedades con campos compatibles private val id1: Int = 0// False// Value la clase no puede tener propiedades con campos compatibles private var id2: int = 0 // false // valor la clase no puede tener propiedades con campos compatibles private latinit var id3: int }
Puede declarar funciones y anular la función toString, pero no puede anular las funciones equals y hashCode
@JvmInlinevalue class ExampleInline(private val value: String) {// Correctinit {println(«Init ExampleInline»)}// Correctfun Greeting() {println(«Hello $value»)}// Correctoverride fun toString(): String { Valor de retorno }// Falso// El miembro llamado ‘equals’ está reservado para versiones futuras ‘ está reservado para versiones futuras. anular fun hashCode(): Int {return super.hashCode()}}
Puede comparar por función de igualdad pero no por igualdad referencial
fun main() {val ejemploEnlinea1 = EjemploEnlinea(«ABC»)val ejemploEnlinea2 = EjemploEnlinea(«ABC»)// CorrectassertEquals(ejemploEnlinea1, ejemploEnlinea1)// CorrectassertEquals(ejemploEnlinea1, ejemploEnlinea2)// Incorrecto// esperado:
Puede escribir código para iniciar la clase JvmInline (en línea), pero no puede compilar
public void main() { // Podemos escribir este código pero obtuvimos un error cuando buildExampleInline exampleInline = new ExampleInline(«ABC»);}/*Error cuando buildExampleTest.java:9: Error: No se puede encontrar SymbolExampleInline exampleInline = new ExampleInline( «ABC»);^símbolo: constructor ExampleInline(String)ubicación: class ExampleInline*/public void main() { // Podemos escribir este código, pero obtenemos un error cuando buildConstructor
Ser visto siempre como el valor subyacente para el código Java
fun String.toInline(): ExampleInline = ExampleInline(this)@JvmName(«saludo1») // para deshabilitar manualmente la manipulación y los nombres en JVMfun String.greeting() {println(«Hello $this»)}@JvmName( «saludo2») // para deshabilitar manualmente el mangle y el nombre en el saludo de JVMfun(valor: String) {println(«Hola $valor»)}@JvmName(«saludo3») // para deshabilitar manualmente el mangle y el primer nombre en el saludo de JVMfun (exampleInline: ExampleInline) {println(«Hello $exampleInline»)}
No, si implementamos una interfaz en una clase en línea, podría considerarse una interfaz
interfaz ExampleInterface@JvmInlinevalue clase ExampleInline(private val value: String) : ExampleInterfacefun String.toInterface(): ExampleInterface = ExampleInline(this)fun Greeting(exampleInline: ExampleInterface) {println(«Hello $exampleInline»)}