为什么Java没有';t支撑结构?(只是出于好奇)

为什么Java没有';t支撑结构?(只是出于好奇),java,struct,Java,Struct,我知道您可以使用公共字段或其他解决方法。或者你根本不需要它们。但出于好奇,为什么Sun不考虑结构。这里有一个例子可以解释Sun的决定: 2.2.2不再有结构或联合体 Java没有作为复杂数据类型的结构或联合。当你有类的时候,你不需要结构和联合;只需使用适当的实例变量声明一个类,就可以实现相同的效果 尽管Java可以支持任意多种类型的类,但运行时只支持少数变量类型:int、long、float、double和reference;此外,运行时仅识别少数对象类型:byte[]、char[]、short

我知道您可以使用公共字段或其他解决方法。或者你根本不需要它们。但出于好奇,为什么Sun不考虑结构。

这里有一个例子可以解释Sun的决定:

2.2.2不再有结构或联合体

Java没有作为复杂数据类型的结构或联合。当你有类的时候,你不需要结构和联合;只需使用适当的实例变量声明一个类,就可以实现相同的效果


尽管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; }
类似于
TimedNamedPoint tpt的字段声明
将创建四个变量:
tpt.x
tpt.y
类型为
int
tpt.startTime
类型为
long
,以及
tpt.name
类型为
String
。声明该类型的参数的行为类似

为了使这些类型变得有用,运行时将需要一些细微的添加:有必要允许函数在返回时在堆栈上保留多个值,而不是简单地使用五种主要类型中的一种返回值。此外,有必要在一个数组中存储多种类型的内容。虽然这可以通过创建一个声明为
TimedNamedPoint[12]
的对象来实现,但实际上它是一个
对象[4]
,该对象将被初始化,以标识
int[12]
的两个实例,一个
长[12]
,一个
字符串[12]
,最好有一种方法,代码可以通过这种方法构造一个数组实例,它可以容纳24个
int
类型的值、12个
long
类型的值和12个
String
类型的值


就我个人而言,我认为对于
Point
,简单聚合的语义要比类的语义干净得多。此外,由于缺少聚合,因此使用一种可以同时返回多种信息的方法是不切实际的。在许多情况下,可以使用一种方法同时计算和报告传入角度的正弦和余弦,所需的工作量远小于单独计算两者所需的工作量,但是必须构造一个
SineAndCosineResult
对象实例将否定通过这样做可以获得的任何速度优势。执行模型不需要做太多更改,就可以允许一个方法在返回时在计算堆栈上留下两个浮点值,但目前不支持这种情况。

因为Java和C系列不是同一种语言。此外,它有类,C没有,所以需要结构。关于结构作为值类型的概念,就像在.Net中发生的那样?谢谢,但一开始他们也抛弃了enum,从1.4开始他们引入了它们。@malakrsnaslava,但你的观点是什么?枚举有一个非常明确的用法,这是使用现有语言功能无法实现的——将它们添加到语言中是一项巨大的资产。顺便说一句,它们是在Java5中添加的。枚举是一个新特性,它提供了各种好处,比如更清晰的代码和类型安全性。编码人员正在寻找实际枚举有用的情况,而现有的解决方案没有那么有用。Java中的结构与C++中的结构相同:一个类。它不会提供更多更清晰的API或客户端代码,也不会添加任何类型安全性方面的内容。可能会有一个JSR用于向规范中添加通用结构,但我无法想象它会有多大吸引力。在.NET中,结构被视为值类型,这使得它们非常有用。我不使用Java的两个主要原因是因为它实现了枚举,以及由于错误地缺少值类型而造成的巨大鸿沟。每次想到在Java for循环中初始化数千个简单对象、读取文件或编写一个没有结构的数据库缓存机制,我都会感到畏缩。我认为有必要问什么是结构?在C++中,结构与类之间的差别不大。在C++中,结构非常不同,允许在堆栈(值类型)上分配,而不是堆(引用类型)。我觉得java缺少了。@ ZokFultTrase:在C++中,类和结构基本上是同义词,除了默认访问级别(如果成员的访问级别被明确指定,它们的行为相同)。在C#中,结构基本上在fashi中运行