with una objetos metodos llamar interoperability instanciar herencia funciones from delegate crear clases clase java delegates kotlin kotlin-interop

una - Llame al objeto Kotlin con delegación de clase de Java como método estático



objetos en kotlin (2)

¡Lamentablemente no es posible!

La delegación de Kotlin es una buena manera de reducir el código de placa de caldera. Pero viene con la incapacidad de acceder al delegado dentro del cuerpo de la clase.

El segundo problema al que se enfrenta con respecto a @JvmStatic es en realidad más drástico para su causa que el primero y también se aplica a usted cuando se implementa la delegación manualmente:

Los miembros anulados no pueden ser ''@JvmStatic'' en el objeto

Entonces, en lugar de exponer el method() través de INSTANCE , podría delegarlo a un staticMethod() en el objeto. Esto aún difiere de tu intención, pero se acerca a ello.

object SingletonKt : FacadeInterface<String> by Facade(String::class.java) @JvmStatic fun staticMethod(from: String, via: String) = method(from, to) }

Esto puede ser un poco difícil de describir, así que intentaré dar un ejemplo concreto de lo que estoy tratando de hacer.

Supongamos que tenemos una interfaz y clase de fachada (en Java), como esta:

interface FacadeInterface<T> { void method(String from, String via); } class Facade<T> implements FacadeInterface<T> { private Class<T> mClazz; public Facade(Class<T> clazz) { mClazz = clazz; } @Override public void method(String from, String via) { System.out.println("Method called from " + from + " via " + via); } }

En mis aplicaciones, necesito tener varios singletons que contengan una instancia de la fachada. La fachada real tiene parámetros adicionales de configuración / configuración, pero estos son irrelevantes aquí.

Antes de comenzar a usar kotlin, tenía una clase que contiene una instancia estática de la fachada (no es realmente un singleton, pero en mi caso, tenía un propósito similar) que servía de proxy para las llamadas a la fachada, como esto:

public class Singleton { private static final FacadeInterface<String> sFacade = new Facade<>(String.class); private Singleton() { } public static void method(String from, String via) { sFacade.method(from, via); } }

Ahora, con Kotlin tenemos delegados de clase que me permiten escribir algo como esto:

object SingletonKt : FacadeInterface<String> by Facade(String::class.java)

Esto es genial, no más repetitivo y puedo llamar a SingletonKt de las clases de Kotlin de la misma manera que llamé al Singleton Java:

Singleton.method("Kotlin", "Singleton") SingletonKt.method("Kotlin", "SingletonKt")

Pero, un pequeño problema surge cuando uso SingletonKt de Java . Entonces tengo que especificar INSTANCE :

Singleton.method("Java", "Singleton"); SingletonKt.INSTANCE.method("Java", "SingletonKt");

Soy consciente de la anotación @JvmStatic , pero el único lugar donde puedo colocarlo en el archivo SingletonKt sin causar errores de compilación es justo antes de FacadeInterface y parece que no funciona.

¿Hay alguna forma de configurar este delegado de clase para que pueda llamarlo desde Java como si fuera un método estático, sin presentar la repetición de la creación de métodos proxy para SingletonKt (que anularía el propósito del delegado de clase)?


No sé si es posible tener métodos delegados como métodos estáticos dentro de un objeto en Kotlin.

Sin embargo, como está interesado en crear singletons que representen a una clase, puede usar constantes de nivel de paquete en Kotlin:

val SingletonKt : FacadeInterface<String> = Facade(String::class.java)

Ahora, puede llamar a SingletonKt.method como lo haría en Java. Tenga en cuenta que necesita usar una importación estática en Java para poder usar la constante SingletonKt .

Esto también le permite usar características como lazy para crear solo el singleton (o, en este caso, la instancia) cuando lo necesite.