Это может быть трудно описать, поэтому я попытаюсь привести конкретный пример того, что я пытаюсь сделать.
Предположим, что у нас есть интерфейс и класс Facade (в Java), например:
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);
}
}
В моих приложениях мне нужно иметь несколько синглтонов, которые содержат экземпляр фасада. Реальный фасад имеет дополнительные параметры настройки/конфигурации, но здесь они неактуальны.
Прежде чем я начал использовать kotlin, у меня был бы класс, который содержит статический экземпляр фасада (на самом деле это не синглтон, но в моем случае он служил аналогичной цели), который проксировал вызовы на фасад, например:
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);
}
}
Теперь с Kotlin у нас есть делегаты класса, которые позволяют мне написать что-то вроде этого:
object SingletonKt : FacadeInterface<String> by Facade(String::class.java)
Это здорово - не больше шаблонов, и я могу назвать SingletonKt
из классов Kotlin так же, как я назвал java Singleton
:
Singleton.method("Kotlin", "Singleton")
SingletonKt.method("Kotlin", "SingletonKt")
Но возникает небольшая проблема, когда я использую SingletonKt
из Java. Затем я должен указать INSTANCE
:
Singleton.method("Java", "Singleton");
SingletonKt.INSTANCE.method("Java", "SingletonKt");
Я знаю аннотацию @JvmStatic
, но единственное место, где я могу помещать его в файл SingletonKt
не вызывая ошибок компиляции, находится прямо перед FacadeInterface
и похоже, что это не трюк.
Есть ли способ настроить делегат этого класса, чтобы я мог его вызывать из Java, как если бы это был статический метод, без введения шаблона создания прокси-методов для SingletonKt
(что бы победить цель делегата класса)?