Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

190
Vistas
Uso de las clases de valor de Kotlin en Java

Tenemos dos proyectos, y el de kotlin publica un paquete importado por java.

En kotlin, es una clase de valor como

 @JvmInline value class CountryId(private val id: UUID) { override fun toString(): String = id.toString() companion object { fun empty(): CountryId = CountryId(EMPTY_UUID) } }

En java, no podemos ver un constructor, o en realidad instanciar esta clase. También he intentado crear una fábrica en Kotlin para crearlos.

 class IdentifierFactory { companion object { fun buildString(): String { return "hello" } fun buildCountry(): CountryId { return CountryId.empty() } } }

En java, puedo llamar a IdentifierFactory.Companion.buildString() y funcionará, pero IdentifierFactory.Companion.buildCountry() ni siquiera existe.

¿Java es realmente tan horrible con las clases de valor?

PD. También lo intenté con @JvmStatic, sin éxito

pps. Si descompilo el código de bytes de kotlin desde el lado de Java y obtengo un CountryId.decompiled.java, así es como se ve el constructor

 // $FF: synthetic method private CountryId(UUID id) { Intrinsics.checkNotNullParameter(id, "id"); super(); this.id = id; }

ppp. Kotlin 1.5.21 y Java 12

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

¿Java es realmente tan horrible con las clases de valor?

Las clases de valor son una característica de Kotlin. Básicamente, son azúcar para permitir una mayor seguridad de tipo (¡en Kotlin!) Al tiempo que reducen las asignaciones al desempaquetar el valor interno. El hecho de que la clase CountryId exista en el código de bytes se debe principalmente a que algunas instancias deben encuadrarse en algunos casos (cuando se usan como un tipo genérico, un supertipo o un tipo que acepta valores NULL; en resumen, algo así como primitivos). Pero técnicamente no está destinado a ser utilizado desde el lado de Java.

En java, puedo llamar a IdentifierFactory.Companion.buildString() y funcionará, pero IdentifierFactory.Companion.buildCountry() ni siquiera existe.

Las funciones con clases de valor en su firma intencionalmente no son visibles desde Java por defecto, para evitar problemas extraños con sobrecargas en Java. Esto se logra mediante la manipulación de nombres . Puede anular el nombre del método Java utilizando la anotación @JvmName en la función de fábrica en el lado de Kotlin para que sea visible desde Java:

 @JvmName("buildCountryUUID") // prevents mangling due to value class fun buildCountry(): CountryId { return CountryId.empty() }

Luego es accesible en el lado de Java y devuelve un UUID (el valor en línea):

 UUID uuid = IdentifierFactory.Companion.buildCountryUUID();

idealmente, me gustaría que el constructor funcione y no use la fábrica

Me di cuenta por los comentarios de que estabas buscando crear instancias reales de CountryId desde Java. Usar el constructor CountryId de Java funciona bien para mí:

 CountryId country = new CountryId(UUID.randomUUID());

Pero no estoy seguro de cómo es esto posible, dado que el constructor generado es privado en el código de bytes...

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda