3

JVM 是否允许使用 struct 创建语言?我的意思是与 C#(和 IL)具有相同的结构。该结构应该是自定义值类型,因此不是垃圾收集器的目标。不要误会我的意思,我不希望 Java 和 C# 一样——我只是想从完全理解 Java 和 JVM 设计的方式和原因的人那里学到一些教训。没有它的动机是什么?Java 社区或 Sun/Oracle 在任何时候都考虑过引入 struct 吗?你知道它周围故事的链接吗?

结论: 所以不是问这个问题的正确地方。因为大约 20 年前没有人与那个决定有关。尽管一些合理的 SO 用户在下面提供了以下可能的原因,即没有按顺序出现自定义值类型(结构):

  1. 自定义值类型会影响 JVM 实现的简单性。
  2. 值类型违反了 Java 试图遵循的 OOP 原则。
  3. 学习曲线。Everything-is-a-reference-object 语言更容易学习。
4

4 回答 4

4

我认为理论上可以在 Java中引入类似结构的类型,而不是垃圾收集类型。但是,由于 Java 没有指针(并且永远不会有),所以类似结构的东西应该总是按值传递,就像原语一样。

主要优点是创建这种值类型的大型数组,而不需要数组的每个项目都有自己的生命周期(和垃圾收集负担)。

您可能会发现这个 10 年前关于在 Java 中引入结构(琐碎数据对象)的讨论很有趣:http ://bugs.sun.com/view_bug.do?bug_id=4820062

于 2013-04-09T23:31:36.230 回答
2

除了原语,Java 没有类似于 C# 的“值类型”。我只能猜测为什么它是这样设计的;可能是为了简单。出于性能原因,基元不太可能是对象。

于 2013-04-09T23:25:59.873 回答
1

就自定义语言而言,我强烈怀疑 JVM 会以任何方式阻止这种情况。它真的没有帮助。您必须将结构类型的局部变量转换为一堆名称损坏的原始类型的局部变量,处理(取消)装箱以将它们存储在集合中并与 Java 库交互,并且通常提出并实现所有值-从头开始类型语义

于 2013-04-09T23:35:04.430 回答
-1

Cstruct可与 Java 相媲美Objects。在 a中,您可以将几个复杂原始struct数据类型打包成一个复杂数据类型,在 Java 中是 a或.classObject

现在,您要使用该对象的方式取决于您。你可以用公共变量打包它,或者你可以给它一些更多的函数/方法来处理这些变量。这一切背后的整个想法是(与 C 语言不同)Java 从一开始就被创建为一种面向对象的语言(好吧,Java 中有一些小方面并不是真正的 OO 的一部分,例如原语 boolean、int 等。 .但那是另一个故事)。

而关于garbage collector,那是 Java 中普通程序员不应该(必须)担心的事情。对象是否以及何时受到垃圾收集取决于运行时。(虽然可以强制垃圾回收,但不是很实用)。

于 2013-04-09T23:29:06.260 回答