繁体   English   中英

在 ORMLite 中,当 Object 似乎可以工作时,为什么我们应该使用具有特定类型 ID 的 DAO?

[英]In ORMLite why should we use DAOs with an ID of a specific type when Object seems to work?

例如,我可以使用Dao<InvoiceItem, Object>Dao<InvoiceItem, UUID>扩展 BaseDaoImpl。 当 Object 似乎也能正常工作时,为什么我要指定 UUID?

到目前为止,我在一个大型项目中的所有 Dao 实现中使用 Object 一直有效。 我想我可能在启用它后破坏了对象缓存功能的情况下绊倒了,但是我对 ORMLite 的 ReferenceObjectCache.java 中用于存储和检索 Map 引用的模式的测试表明,它适用于强类型键或键转换为对象。

我仍然没有弄清楚为什么启用它后对象缓存功能对我不起作用(相同的数据,不同的对象),但试图弄清楚这一点让我想知道为什么甚至有理由在一个中指定 ID 类型从 ORMLite DAO 开始。

例如,我可以使用Dao<InvoiceItem, Object>Dao<InvoiceItem, UUID>扩展BaseDaoImpl Object似乎也能正常工作时,为什么我要指定UUID

Dao是一个泛型类。 当您谈论List<UUID>List<Object>相比时,您的问题会很相似。 泛型类型意味着当您调用dao.deleteById(uuid)时,它将提供类型检查以验证 id 是否是正确的类。 如果您使用的是Object id,您可能会不恰当地调用dao.deleteById("hello")如果 ID 字段是UUID则找不到您的对象。

此外,如果您调用UUID id = dao.extractId(data) ,则不必转换结果,因为编译器知道该方法返回UUID

到目前为止,我在一个大型项目中的所有 Dao 实现中使用 Object 一直有效。

泛型类型实际上仅适用于调用者,并提供编译器时类型检查。 BaseDaoImpl中的ID类型实际上只是一个对象。

这是 Oracle 提供的关于 我们为什么使用泛型的教程,可能有助于您理解。 他们的首要原因是:

  • 在编译时进行更强的类型检查。
  • 消除演员表。
  • 程序员可以实现适用于不同类型集合的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM