当前位置: 首页 > 知识库问答 >
问题:

Kotlin对象作为插口的注入点

戚飞雨
2023-03-14

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

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

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

共有2个答案

帅锦
2023-03-14

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

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

    override fun onEnable() {
        instance = this
    }
}

这将允许您以对象的形式调用这个类,只要您将方法放在伴生对象中

Plugin.instance.doSomething()

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

Plugin.doSomethingWithInstance()

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

盖泽宇
2023-03-14

我不相信有一种方法可以对一个对象做到这一点,但是你可以通过使用全局变量来伪造一个对象:

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

class InjectionClass {
    init { injectionInstance = this }

    var someVar = 0
}

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

 类似资料:
  • 我有来自一个API的数据,看起来如下所示 使用reverfit,我尝试使用下面的代码将它转换为一个对象。为了测试,它目前被提供了一个静态变量,如邮政编码,这是已知的工作。 服务类。 地址类 位置类 地址接口 在使用调试器时,我看到调用跳过onFailure和onResponse函数,只返回仍然为空的addresses。我甚至在这两个函数中都放入了print语句,但终端中都没有显示这两个函数,以确认

  • 4.3、4.4节介绍了如何将C++对象导出到JavaScript环境,本节将介绍其逆操作,既:将JavaScript对象注入到C环境。 4.5.1 创建JavaScript对象/ID表 无论从内存模型的角度,还是从运行模型的角度,C原生代码都无法直接访问JavaScript中的对象。为此,我们需要提供一种途径,让C环境可以识别不同的JavaScript对象,最容易想到的,就是使用对象/ID表,该方

  • 我们有一个包含数百个类/枚举的大型应用程序,我们希望使用MongoDB来存储其中的一些。 目前的情况是,我们有一个二进制序列化的系统。NET对象转换为SQL数据库中的字段,然后按需反序列化。我们想要的是以一种允许我们直接查询对象属性的方式将对象放入Mongo(即,不必将对象加载到内存、反序列化等)。这样我们就可以从历史数据中获得一些分析,而无需大幅更改代码库。 我的问题是,这很容易实现吗?C#驱动

  • 问题内容: 我想在我的SQL Server 2016表中插入一些JSON对象。 我的表结构如下: 我正在使用以下查询来插入我的数据: 但是,表中仅填充和的值。这两个和值是NULL。 我的查询出了什么问题?如何将JSON对象作为nvarchar插入? 问题答案: 我承认我对SQL Server 2016中的JSON内容没有任何经验,但是请看一下本教程: https://docs.microsoft.

  • 我刚开始使用Dagger并尝试使用dagger2进行DI,但看起来它给我的活动注入了一个空演示器。下面是我的代码。 公共类TasksActivity扩展AppCompatActivity{

  • 嗨,当我尝试在下面的类中注入Doa接口时,我正在使用mvvm和dagger2 我的接口类