这可能有点难以描述,所以我将尝试举一个具体的例子来说明我正在尝试做的事情。
假设我们有一个 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)
这很棒 - 不再需要样板文件,我可以像调用java 一样SingletonKt
从 KotlinSingleton
类调用:
Singleton.method("Kotlin", "Singleton")
SingletonKt.method("Kotlin", "SingletonKt")
SingletonKt
但是,当我使用from Java时会出现一个小问题。然后我必须指定INSTANCE
:
Singleton.method("Java", "Singleton");
SingletonKt.INSTANCE.method("Java", "SingletonKt");
我知道@JvmStatic
注释,但是我可以将它放在SingletonKt
文件中而不会导致编译错误的唯一位置是之前FacadeInterface
,它似乎并没有起到作用。
有没有办法设置这个类委托,以便我可以从 Java 调用它,就好像它是一个静态方法一样,而不引入创建代理方法的样板SingletonKt
(这会破坏类委托的目的)?