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: pero fue:afirmarEquals(ejemploEnlinea1, «ABC»)// Falso// Igualdad para argumentos de tipo EjemploEnlinea y EjemploEnlinea está prohibido assertEquals(ejemploEnlinea1 === ejemploEnlinea1)// False// Igualdad para argumentos de tipo EjemploEnlinea y EjemploEnlinea está prohibidaassertEquals(ejemploEnlinea1 == = ejemploEnLínea2)val lista = listaDe(ejemploEnLínea1, ejemploEnLínea2)val map = mapOf(«1″ a ejemploEnLínea1,»2″ a ejemploEnLínea2)// CorrectassertTrue(lista.contiene(ejemploEnLínea1))// CorrectassertTrue(lista.contiene(EjemploEnLínea( » ABC»)))// CorrectassertTrue(list.contains(ExampleInline(«ABC»)))// CorrectassertTrue(map.containsValue(exampleInline1))// CorrectassertTrue(map.containsValue(ExampleInline(«ABC»)))}Clase JvmInline (en línea) no tienen identidad y solo pueden contener valores. Esto se debe a que son un subconjunto de clases basadas en valores. Y también afecta la asignación de memoria. En el ejemplo: class ExampleActivity : AppCompatActivity() {val exampleInline: ExampleInline = ExampleInline(«»)val exampleNotInline: ExampleNotInline = ExampleNotInline(«»)}@JvmInlinevalue class ExampleInline(private val value: String)class ExampleNotInline(private val value: String ) Y cuando la memoria de volcado de montón:ExampleInline no se puede mostrar en la asignación de memoria.

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 constructor = ExampleInline.class.getConstructor(String .class);ExampleInline exampleInline = constructor.newInstance(«ABC»);}/*ExampleInline.(java.lang.String)java.lang.NoSuchMethodException*/

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»)}

Deja una respuesta

Tu dirección de correo electrónico no será publicada.