这只是一个出于好奇心的简单理论问题。我一直都像个Java迷。但有一件事让我想知道为什么Java不提供在堆栈上创建对象的机制?如果我可以像在C#中创建结构体一样,在堆栈上创建小的Point(int x,int y)对象,不是更有效率吗?Java是否因为特殊的安全原因而限制了这种功能呢? :)
这只是一个出于好奇心的简单理论问题。我一直都像个Java迷。但有一件事让我想知道为什么Java不提供在堆栈上创建对象的机制?如果我可以像在C#中创建结构体一样,在堆栈上创建小的Point(int x,int y)对象,不是更有效率吗?Java是否因为特殊的安全原因而限制了这种功能呢? :)
这里的策略是,Java不会将这个决定泄漏到语言中,而是让JVM/Hotspot/JIT/runtime决定在哪里以及如何分配内存。
有研究正在进行以使用“逃逸分析”来找出哪些对象实际上不需要进入堆并将它们分配到栈上。我不确定这是否已经被纳入主流的JVM中。但如果这样做了,它将由运行时控制(像-XX:something这样的东西),而不是由开发人员控制。
这样做的好处是即使旧代码也可以从这些未来的增强中受益,而不必更新代码本身。
如果您喜欢手动管理(但仍然希望编译器检查它是否“安全”),那么可以看看Rust。
这个功能暂时会被引入到Java中,目前还没有确切的发布时间,所以你只能希望它会在Java 10中出现。
这项提议被称为“Value Types”,您可以在“Valhalla项目”的邮件列表中关注它。
我不知道它最初为什么没有出现在语言中,可能最初认为它是不必要的,或者根本没有时间来实现它。
一个常见的问题是使用在堆栈上创建的对象来初始化一些全局引用。当创建该对象的方法退出时,你要指向什么?
尽管如此,在Java中也可以使用堆栈创建对象,只是使用了逃逸分析(Escape Analysis)来确保不会发生上述情况。