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

时间:2014-11-24 16:02:30

标签: java struct

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

2 个答案:

答案 0 :(得分:11)

这是link,解释了Sun的决定:

  

2.2.2没有更多结构或联盟

     

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

答案 1 :(得分:3)

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

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

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

aggregate TimedNamedPoint
{ int x,y; long startTime; String name; }

TimedNamedPoint tpt;这样的字段声明会创建四个变量:tpt.xtpt.y类型inttpt.startTime类型long,以及类型为tpt.name的{​​{1}}。声明该类型的参数的行为类似。

要使这些类型有用,运行时需要一些小的补充:有必要允许函数在返回时在堆栈上留下多个值,而不是简单地将一个返回值设置为五个主要类型。另外,有必要有一种在阵列中存储多种东西的方法。虽然这可以通过创建声明为String的事物实际上是TimedNamedPoint[12]来实现,而Object[4]将被初始化以识别int[12]long[12]的两个实例,以及String[12],最好有一种代码可以构造单个数组实例的方法,可以容纳24个类型为int的值,12个类型为long,12个类型为{{ 1}}。

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