This may be a bit difficult to describe, so I'll try to give a concrete example of what I'm trying to do.
假设我们有一个门面接口和类(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);
}
}
Now, with Kotlin we have class delegates which allow me to write something like this:
object SingletonKt : FacadeInterface<String> by Facade(String::class.java)
这很棒-没有更多的样板,我可以调用SingletonKt
个from Kotlin类,就像我调用Java Singleton
的方式一样:
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
创建代理方法的样板文件(这会 destruct 类委托的用途)?