JVM是否允许使用struct创建语言?

时间:2013-04-09 23:16:41

标签: java struct garbage-collection

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

结论: SO不是一个提出这个问题的好地方。因为20年前没有人与这个决定有关。虽然下面提供了一些合理的SO用户,但他们出现了以下可能的原因:

  1. 自定义值类型会影响JVM实现的简单性。
  2. 值类型违反了Java试图遵循的OOP原则。
  3. 学习曲线。一切都是参考对象语言 更容易学习。

4 个答案:

答案 0 :(得分:4)

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

主要优点是创建此值类型的大型数组,而数组中的每个项都没有自己的生命周期(以及垃圾回收负担)。

你可能会发现这篇关于在Java中引入结构(普通数据对象)的10年讨论很有意思:http://bugs.sun.com/view_bug.do?bug_id=4820062

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:-1)

C struct与Java Objects相当。在struct中,您可以将多个复杂原始数据类型打包到一个复杂数据类型中,该数据类型位于Java {{1} }或class

现在,您想要使用该对象的方式取决于您。您可以使用公共变量对其进行打包,也可以为其提供更多函数 / 方法来处理这些变量。所有这一切背后的全部思想是(与C语言不同)Java从一开始就被创建为面向对象的语言(好吧,Java中有一些小的方面,它们实际上不是OO的一部分,比如原语boolean,int等。但那是另一个故事。)

关于Object,那就是Java中的一些普通程序员不应该(不得不)担心。如果Object何时以及何时进行垃圾收集,则由运行时决定。 (虽然可以强制进行垃圾收集,但这不太实用)。