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

205
Vistas
¿Cómo defino e instancia una sola instancia de una clase interna anónima en una sola expresión?

En Kotlin, quiero agregar un "espacio de nombres" a una clase que tenga un conjunto de funciones relacionadas. Los clientes de mi clase usarán ese espacio de nombres para ayudar a clasificar qué tipo de operación quieren hacer. (Sé que estás pensando que las funciones deberían estar en diferentes clases, problema resuelto. Pero por otras razones, es conveniente albergar todas las funciones en una sola clase).

Entonces, podría tener una clase Uber que contenga fooInsert fooOpen fooDispose junto con barInsert barTerminate y barHop . Como puede ver, no hay una interfaz común. Solo un montón de funciones que por alguna razón pertenecen a la misma clase. Algunas tienen afinidad con otras (es decir, las funciones fooXXX "pertenecen" juntas, al igual que las funciones "barYYY").

Lo que se me ha ocurrido es:

 class Uber { inner class FooNamespace { fun insert(): Unit {} fun open(): Unit {} fun dispose(): Unit {} } val foo = FooNamespace() inner class BarNamespace { fun insert(): Unit {} fun terminate(): Unit {} fun hop(): Unit {} } val bar = BarNamespace() }

Los usuarios de la clase pueden hacer algo como esto:

 val uber = Uber() uber.foo.insert() uber.bar.hop()

Lo que me gustaría es algo que combine la inner class ... y val xxx = XxxNamespace() en una sola expresión. Algo como:

 // This doesn't actually compile val foo = object: inner class { fun insert(): Unit {} fun open(): Unit {} fun dispose(): Unit {} }
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

El problema aquí es que necesita un tipo correctamente definido si desea acceder a estos miembros públicamente.

Para propiedades privadas, la sintaxis val foo = object { ... } es suficiente, pero para propiedades expuestas públicamente, estas se infieren como Any y las hace inutilizables.

Obviamente, una opción es definir una interfaz para estos tipos, pero es aún más repetitivo que lo que ya se te ocurrió, por lo que estoy bastante seguro de que esto no se adaptará a tus necesidades:

 interface FooNamespace { fun insert() fun open() fun dispose() } class Uber { val foo = object : FooNamespace { override fun insert(): Unit {} override fun open(): Unit {} override fun dispose(): Unit {} } }

Sé que estás pensando que las funciones deberían estar en diferentes clases, problema resuelto. Pero por otras razones, es conveniente albergar todas las funciones en una sola clase.

Realmente estoy pensando eso, y me encantaría saber más sobre lo que hace que sea tan conveniente poner todo en la misma clase :) Dado que las clases son inner classes , asumo que esto tiene que ver con acceder al estado privado desde Uber , pero eso también se puede hacer envolviendo este estado privado en otra clase que se pasa a foo y bar.

over 4 years ago · Santiago Trujillo Denunciar

0

Creo que esto no es posible, al menos por ahora.

El principal problema técnico aquí es que uber.foo.insert() realmente se interpreta como un encadenamiento de uber.foo y luego .insert() . Entonces, para que esto funcione, uber.foo debe tener un tipo definido explícitamente. No puede ser una clase/objeto anónimo, porque entonces no hay manera de describir cuál es el tipo de uber.foo .

Dicho esto, siempre me he preguntado por qué Kotlin no admite esta sintaxis:

 val foo = object Foo {}

Esto es consistente con la declaración de objeto donde el nombre del singleton es al mismo tiempo el nombre de la clase. Y el compilador incluso entiende esta sintaxis anterior, porque arroja el error: "Una expresión de objeto no puede vincular un nombre". Entonces, los autores de Kotlin parecen rechazar intencionalmente dicho uso.

Encontré un problema en YouTrack, así que al menos podemos votarlo: https://youtrack.jetbrains.com/issue/KT-21329

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