V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
JamesChen
V2EX  ›  问与答

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

  •  1
     
  •   JamesChen · May 7, 2021 · 819 views
    This topic created in 1820 days ago, the information mentioned may be changed or developed.
    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 replies    2021-05-07 14:07:17 +08:00
    TtTtTtT
        1
    TtTtTtT  
       May 7, 2021
    我看了一下,https://openjdk.java.net/jeps/401 这里好像是支持的。不过,Primitive Object 好像是不可变的,传统语言那种基于引用传递返回值的方法好像就没法在 Java 上使用了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2176 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:11 · PVG 00:11 · LAX 09:11 · JFK 12:11
    ♥ Do have faith in what you're doing.