Kotlin对象';s作为套管的注入点

Kotlin对象';s作为套管的注入点,kotlin,minecraft,bukkit,Kotlin,Minecraft,Bukkit,我一直在将Kotlin与Bukkit框架一起使用,到目前为止,它非常棒。不过我有一个主要问题。Bukkit要求主插件类是一个类,以便spiget可以创建它的实例 我正在用Bukkit框架为Kotlin编写一个库,因为它最初是用Java编写的。我遇到的主要问题是,几乎所有方法都需要JavaPlugin类的实例,但我不想使用依赖项注入。拥有一个对象或对JavaPlugin实例的静态访问可以解决这个问题 有没有什么方法可以创建某种包装器或类似的东西来将类的行为委托给对象?我不相信有什么方法可以用对象来

我一直在将Kotlin与Bukkit框架一起使用,到目前为止,它非常棒。不过我有一个主要问题。Bukkit要求主插件类是一个类,以便spiget可以创建它的实例

我正在用Bukkit框架为Kotlin编写一个库,因为它最初是用Java编写的。我遇到的主要问题是,几乎所有方法都需要JavaPlugin类的实例,但我不想使用依赖项注入。拥有一个对象或对JavaPlugin实例的静态访问可以解决这个问题


有没有什么方法可以创建某种包装器或类似的东西来将类的行为委托给对象?

我不相信有什么方法可以用对象来实现这一点,但是可以使用全局变量来伪造对象:

val Injection: InjectionClass
    get() = injectionInstance
private lateinit var injectionInstance: InjectionClass

class InjectionClass {
    init { injectionInstance = this }

    var someVar = 0
}

然后在另一个文件中可以使用
Injection.someVar
,就像
Injection
是一个对象一样。这样做的一个缺点是IntelliJ IDEA的语法高亮显示将
注入显示为紫色斜体而不是白色,但除此之外,还必须使用
注入类
,如果您需要将其指定为类型,它应该可以完美地工作

您可以创建一个单例,因为您不能使用object;Bukkit必须构造JavaPlugin,因此不能使用直接单例。您可以使用类似的方法实现自己的功能:

class Plugin : JavaPlugin() {
    companion object {
        lateinit var instance: Plugin
        private set
    }

    override fun onEnable() {
        instance = this
    }
}
这将允许您以对象的形式调用这个类,只要您将方法放在伴生对象中

Plugin.instance.doSomething()
或者向该伴生对象添加方法来处理实例,而不是直接获取实例,然后可以使用最相似的对象语法

Plugin.doSomethingWithInstance()

我不相信还有其他的解决方案,但这已经非常接近你想要的了

你尝试过做什么,为什么没有成功?我尝试过让我的插件类成为一个对象,但是这不起作用,因为bukkit框架必须实例化它。展示一个快速的示例对于我们了解您实际想要实现的目标非常有用!如果你能用一个你想要的例子来更新你的文章,我们可以帮助你更好的解决这个问题。你想做什么,要求它是一个对象?以静态方式调用方法?我正在用Bukkit框架为Kotlin编写一个库,因为它最初是用Java编写的。我遇到的主要问题是,几乎所有方法都需要JavaPlugin类的实例,但我不想使用依赖项注入。拥有一个对象或对JavaPlugin实例的静态访问可以解决这个问题。这种方式不是OP想要的,使用它作为插件实例的对象,你需要引用一个实例,而不是引用类本身。我不明白这与公认的答案有何不同,除了上面有一点语法糖。对象实际上是单例的语法糖,这允许您有效地使用与对象相同的静态语法。我认为,以这种方式持有顶级实例似乎隐藏了类是静态进行操作的。在某种程度上,这似乎不是类在做事情,而是实例在做事情。我认为,对于一个对象,虽然它只是一个合成糖,但它看起来与类更相关。谢谢,这解决了我的问题。我知道这个特性,但没有考虑在这个场景中使用它。