Kotlin:确保在编译时为类型调用方法

Kotlin: Ensure method is called for type during compile time

提问人:Felipe Ribeiro R. Magalhaes 提问时间:10/27/2023 更新时间:10/28/2023 访问量:27

问:

我们在应用程序中实现了一个逻辑,该逻辑允许在数据库模型中通过其 ID 引用其他对象。如果具有该 ID 的该类型的对象不在 DB 上,那么我们获取它并将其存储到 DB 中,以便连接正常工作。

基本上,我们“教”加载器为我们希望此连接工作的每种类型调用什么后端 API。我们在应用程序启动时执行此操作。

例如,这里我们为 Car 和 CarModel 设置逻辑:

batchRefreshService.registerLoader(RealmCar::class) { ids, page ->
    itemsAPI.getCars(CarFilter(ids), page, BATCH_SERVICE_CHUNK_SIZE)
}

batchRefreshService.registerLoader(RealmCarModel::class) { ids, page ->
    itemsAPI.getCarModels(CarModelFilter(ids), page, BATCH_SERVICE_CHUNK_SIZE)
}

我们如何使用它的一个例子在哪里。当我们获取特定“赛道”的“最佳时间”列表时,每个条目都有一个 carId,它告诉我们使用哪辆车来获得该时间。在为那些最佳时间创建数据库条目时,我们只是这样做

var car: RealmCar? = batchRefreshService.ensureRealmObjectById(realm, this.carId)

这保证了我们可以在需要时从 Track 对象访问 Car 对象。它运行良好。

我遇到的问题是,在编译期间,我们不知道是否为特定类注册了“加载器”。随着项目的发展和越来越多的人加入,这可能变得难以维护:我们可能会假设加载器存在并且已经由某人设置,但事实并非如此。如果您尝试在没有注册加载器的情况下获取对象,我们确实会抛出异常,但是在编译时将其作为警告会很棒。我唯一能想到的就是摆脱泛型方法,为每种类型实现一个方法。所以取而代之的是 ,等等。但这很糟糕,我们需要很多方法,但它会阻止人们使用不起作用的类调用方法。ensureRealmObjectById()ensureRealmCarById()

我可以使用任何语言功能或任何模式来帮助在构建时使其失败,如果与尚未设置加载器的类一起使用,甚至可能在 IDE 上发出警告?

数据库 kotlin 泛型 器错误 编译 器警告

评论

1赞 Jorn 10/27/2023
听起来像是单元测试的一个很好的案例。只需调用注册逻辑,然后循环访问所有模型类型,并查看它们是否具有已注册的加载器。这不是一个编译错误,但如果你有一个正确的CI设置,它应该可以很好地解决这个问题。

答:

0赞 AndrewL 10/28/2023 #1

你这样说:

我遇到的问题是,在编译期间,我们不知道是否为特定类注册了“加载器”。

这真的是你的问题吗,因为如果是这样,你需要做的就是在注册处理器()中跟踪注册的类,然后你可以确定“特定类”是否被注册。batchRefreshService

相反,我认为你的问题是:

我们想知道在编译时是否所有可能的 (CAR) 类都已向注册处理器注册 (batchRefreshService)

接下来,你说你想要一个编译时处理器。如果您曾经使用过 Lombok,那么它会在编译时执行以添加 getter 和 setter 等。因此,有可能,但(我认为)很难走编译时路线(参考:龙目岛是如何工作的)。也许你可以放宽这个要求?所以它要么是

  • 编译时,或者
  • 单元测试时间(如@Jorn注释中建议的那样),或
  • 运行

对于所有这些,如果我正确解释了这个问题,您需要找到“所有可能的(汽车)类”。如果你能找到所有可能的类,那么像这样:

(假设您选择运行时方法)

  1. 允许所有代码组件进行注册,同时跟踪已注册的类
  2. 完成所有组件的注册后
    1. 找到所有可能类的集合
    2. 断言它们已注册,否则失败

你使用的是像 Spring 这样的框架吗?在 Spring 中,这些组件将带有 or 注释,并且您可以通过让另一个组件依赖于这些组件来轻松填充这些组件的列表,假设它们都实现了相同的接口(即使是空的/标记接口)。@Component@Service

由于我不知道您使用的是什么框架(如果有的话),或者即使我有正确的问题,我也会到此为止......