Valhalla 项目中的 Primitive Object 只支持值传递,这是个糟糕的设计吗?

2021-05-07 12:32:38 +08:00
 JamesChen
Primitive Object 本身影响面极广,算个相对激进的设计(相比 Kotlin 的 Inline classes只是在 compiler 级别为上层开发者提供类似特性),但 Primitive Object 让人疑惑的是,它为何不支持实用的引用传递来丰富高级特性(像 C 一样,通过第一个 member 的地址),而仅支持值传递(限制了这个特性的实际应用场景)?

众所周知,C 里的 struct 既可以值传递,也可以引用传递(通过第一个 member 的地址),我们在实践的过程中,也通常会用引用传递,来避免不必要的 copy 。

而 Primitive Object 在宣传的时候强调“Just data, no identity”,强调的是没有对象头(像传递 Java 对象体系中的八大基本类型一样),但问题在于“Java only has pass-by-value”只支持值传递,不支持引用传递。这样这个特性对于很多上层 Java 框架开发者而言就有点鸡肋了,因为别人希望拥有更紧凑的内存 layout (好事)(尤其对于 Object 数量特别多的 DTO/DO 等模型),但却要以只支持值传递为代价,得不偿失。可能就八大包装类或这类本身结构非常简单的对象适合用 primitive object 。

明明像 C struct 一样支持引用传递,适用面明显就更广,同时结构也能够更紧凑,那为何不这么设计呢?而是另辟蹊径,吃力不讨好?

欢迎各位大神指点。

参考技术文档: https://www.oracle.com/technetwork/java/jvmls2016-goetz-3126134.pdf
466 次点击
所在节点    问与答
1 条回复
TtTtTtT
2021-05-07 14:07:17 +08:00
我看了一下,https://openjdk.java.net/jeps/401 这里好像是支持的。不过,Primitive Object 好像是不可变的,传统语言那种基于引用传递返回值的方法好像就没法在 Java 上使用了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775400

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX