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