【问题标题】:Creating types as wrapper for primitive types创建类型作为原始类型的包装器
【发布时间】:2016-06-16 23:11:23
【问题描述】:

我们经常有很多实体类型的项目(Hibernate/JPA,...)。实体类型有一个基本类型,如用于 ID 的 int、long 或 string。我们有接受和返回这些原语的 DAO 和服务。

long doSomething(long blubId, long blabId, long fooId, long barId, ...)

如您所见,这可能非常令人困惑。我想利用静态类型检查并为其设置类型。

long doSomething(BlubId blubId, BlabId blabId, FooId fooId, BarId barId, ...)

但这似乎效率低下。您对如何解决此问题有任何想法吗?

注意,在 JEE 上下文中有时需要使用原语进行处理(JSF 支持的 bean、持久性......)

【问题讨论】:

  • “但这似乎效率低下” - 在您进行数据库调用的情况下,您预计这种低效率会有多严重?
  • 在 Java 中没有特殊的方法可以做到这一点。您只需创建一个普通类 BlubId,其中包含一个 long 字段、一个 getter,可能还有一个 equals/hash/toString。它会像任何其他类一样工作。 (其他语言有特殊的处理方式,但 Java 没有。)
  • @JonSkeet 在内存方面可能效率低下。想象一下许多复杂对象的集合。反过来,复杂对象具有 blubId、blabId、... 作为成员。将 ID 作为原始 ID 而不是在堆上分配内存至少为 BLOCKSIZE(通常 = 512b)的对象(包装器)在内存方面成本较低。也别忘了 GC,...
  • 在 C/C++ 中可以: typedef unsigned long BlubId;问题解决了。
  • @kalamar:当然,周围有很多小物体,可能时间很短。 GC 擅长处理这个问题。我希望您的实际 data(字符串等)无论如何都会相形见绌。您是否真的 测量 效率低下,有具体目标?当然,在 C++ 中有一些方法可以做到这一点 - 但这些方法在 Java 中不起作用。

标签: java typechecking


【解决方案1】:

这似乎是构建器模式的主要候选者,其中您有一个 DoSomethingOptions 类和一个 DoSomethingOptionsBuilder,它通过命名方法显式创建选项以避免参数顺序混淆。

说实话,我不认为您的初始方法非常低效,但这实际上取决于您的 doSomething 方法被调用的频率以及该方法的实际逻辑需要多长时间。显然,对基元使用包装器会占用更多空间和少量时间,但与任何实际计算相比,这几乎是无关紧要的。

【讨论】:

  • 构建器对象与原始方法存在相同的问题。每个构建器方法都将使用long,因此您最终仍可能使用错误的表 ID
  • 我认为包装原语和构建器模式的组合将是一个聪明的解决方案......只要调用 doSomething 需要足够的时间来忽略创建一些对象的成本。
  • 您从 builder 方法中获得的好处是您有一个明确的行,上面写着 builder.withBlubId(123).withOtherSpecificId(234),它为您提供了命名参数,因此更难将顺序弄乱。这听起来像是他一开始就试图避免的问题。您如何看待有人在此范例中错误地使用了错误的 tableId?
  • 只有在变量名很明显的情况下才会有帮助。想象一下,电话看起来像这样builder.withBlubId(foo).withOtherSpecificId(bar)。乍一看,foo 实际上是 BlubId 或者如果您将其与 bar 混淆,仍然不明显
  • 正确,但变量命名不佳和相同类型的参数缺乏透明度是两个不同的问题。后者可以通过构建器模式解决,前者可以通过将变量命名为 foobar 以外的名称来解决,这在一个人为的示例中似乎是合理的,但实际上我发现它怀疑他们会命名他们的变量。
【解决方案2】:

据我了解,您可能有兴趣查看已经编写好的 Java 包装类 Java Primitive Wrapper class

【讨论】:

  • 不,关键是BlubIdBlabId 都是long 的包装器,但用于不同的表。我不知道Long 会对此有何帮助。
猜你喜欢
  • 2021-09-11
  • 2018-06-26
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多