V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JamesChen
V2EX  ›  问与答

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

  •  1
     
  •   JamesChen · 2021-05-07 12:32:38 +08:00 · 471 次点击
    这是一个创建于 1304 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    1 条回复    2021-05-07 14:07:17 +08:00
    TtTtTtT
        1
    TtTtTtT  
       2021-05-07 14:07:17 +08:00
    我看了一下,https://openjdk.java.net/jeps/401 这里好像是支持的。不过,Primitive Object 好像是不可变的,传统语言那种基于引用传递返回值的方法好像就没法在 Java 上使用了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2610 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:34 · PVG 14:34 · LAX 22:34 · JFK 01:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.