为什么Java不支持结构?(只是出于好奇)

139*_*ser 6 java struct

我知道你可以使用公共领域或其他一些解决方法.或许你根本不需要它们.但出于好奇,为什么Sun离开了建筑物.

man*_*uti 11

这是一个解释Sun决定的链接:

2.2.2没有更多的结构或联盟

Java没有结构或联合作为复杂数据类型.当你上课时,你不需要结构和工会 ; 只需通过声明具有适当实例变量的类,即可实现相同的效果.

  • 结构作为值类型的概念怎么样,就像 .Net 中那样? (3认同)
  • 枚举是一项新功能,提供了各种好处,如更清晰的代码和类型安全.编码器发现真正的枚举有用的情况,现有的解决方案并没有那么有用.Java中的结构与C++中的结构相同:一个类.它不会提供更清晰的API或客户端代码,或者以类型安全的方式添加任何东西.可能有一个JSR用于在规范中添加通用结构,但我无法想象它会得到很大的牵引力. (2认同)

sup*_*cat 4

虽然Java可以支持任意多种类,但运行时只支持几种变量类型:int、long、float、double和reference;此外,运行时仅识别几种对象类型:byte[]、char[]、short[]、int[]、long[]、float[]、double[]、reference[]和非数组对象。系统会为每个引用变量或数组实例记录一个类类型,运行时会执行某些检查,例如确保存储到数组中的引用与数组类型兼容,但这种行为只是将对象的类型视为“数据” ”。

我不同意类的存在消除了对结构的需要的说法,因为结构具有与类对象根本不同的语义。另一方面,从运行时系统设计的角度来看,添加结构使类型系统变得非常复杂。在没有结构的情况下,类型系统只需要八种数组类型。向类型系统添加结构需要类型系统识别任意数量的不同变量类型和数组类型。这种识别很有用,但 Sun 认为不值得这么复杂。

考虑到 Java 运行时和类型系统运行的限制,我个人认为它应该包含有限形式的聚合类型。其中大部分将由语言编译器处理,但需要运行时中的一些功能才能真正正常工作。给予声明

aggregate TimedNamedPoint
{ int x,y; long startTime; String name; }
Run Code Online (Sandbox Code Playgroud)

像这样的字段声明TimedNamedPoint tpt;将创建四个变量:tpt.xtpt.yof type inttpt.startTimeof typelongtpt.nameof type String。声明该类型的参数的行为类似。

为了使此类类型有用,运行时需要进行一些细微的添加:有必要允许函数在返回时在堆栈上留下多个值,而不是简单地具有五种主要类型之一的单个返回值。此外,还需要有一种方法可以在数组中存储多种类型的事物。虽然这可以通过创建一个TimedNamedPoint[12]实际上声明为 an的东西来实现Object[4],该东西将被初始化以标识int[12]、 along[12]和 a的两个实例String[12],但最好有一种方法可以让代码构造一个可以保存的单个数组实例24 个 type 值int、12 个 type 值long和 12 个 type 值String

就我个人而言,我认为对于诸如 之类的东西Point,简单聚合的语义比类的语义要清晰得多。此外,缺乏聚合通常使得拥有一种可以同时返回多种信息的方法变得不切实际。在许多情况下,可以有一个方法同时计算和报告传入角度的正弦和余弦,其工作量比单独计算两者所需的工作少得多,但必须构造一个对象实例会否定SineAndCosineResult任何这样做本来可以获得速度优势。执行模型不需要做太多改变来允许方法在返回时在计算堆栈上留下两个浮点值,但目前不支持这样的事情。