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

问题描述 投票:0回答:1

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

基本上,我们“教导”加载器为我们希望此连接工作的每种类型调用什么后端 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)

这保证了我们可以在需要时从轨道对象访问汽车对象。效果很好。

我遇到的问题是,在编译期间,我们不知道是否已为特定类注册了“加载器”。随着项目的发展和更多人的加入,这可能会变得难以维护:我们可能假设加载程序存在并且已由某人设置,但事实并非如此。如果您尝试获取一个对象而不为其注册加载器,我们确实会抛出异常,但如果在编译时将其作为警告,那就太棒了。我唯一能想到的就是摆脱通用方法并为每种类型实现一个方法。所以不是

ensureRealmObjectById()
而是
ensureRealmCarById()
等等。但这很糟糕,我们需要很多方法,但它会阻止人们调用不起作用的类的方法。

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

database kotlin generics compiler-errors compiler-warnings
1个回答
0
投票

你这样说:

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

这实际上是您的问题吗?因为,如果是这样,您需要做的就是在注册处理器(

batchRefreshService
)中跟踪注册的类,然后您可以确定“特定类”是否是或未注册。

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

我们想在编译时知道所有可能的(汽车)类是否已在注册处理器中注册(

batchRefreshService

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

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

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

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

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

你使用像Spring这样的框架吗?使用 Spring,组件将用

@Component
@Service
进行注释,并且您可以通过使另一个组件依赖于这些组件来轻松填充这些组件的列表,假设它们都实现相同的接口(甚至是空/标记接口)。

因为我不知道你正在使用什么框架(如果有的话),或者即使我有正确的问题,我也会在这里停止......

© www.soinside.com 2019 - 2024. All rights reserved.