也许我仍然错过了一个重要的概念。
为了允许读取和防止写入非原始成员,相应的 getter 总是创建成员对象的新副本。出于性能原因,我想防止这种情况发生。我正在尝试编写一个基于四叉树的带有碰撞检测的简单 2D 模拟器,这将是生计。
我认为在 C++ 中我可以通过返回一个 const 来做到这一点。(我知道我可以用强制转换覆盖它)但我不确定这是如何在 JAVA 中完成的。
有任何想法吗?
有几种方法可以归档您想做的事情。
const
首先,对于C++ 中的功能没有语言支持。
无论如何,我建议您使用 Getter 和 Setter,因为它们不会造成任何开销。Java 即时优化处理了这一点。
对于非原始类型,您仍然会遇到返回的对象本身可能会被更改的问题。有三种方法可以防止这种情况。
您可以自由地使任何自定义引用类型不可变。
你是说你克隆每个对象?您可能有堆问题。我更喜欢不可变的解决方案。它是线程安全的,内存占用更少。
Java 中没有对 C++ return const 的语言支持。您可以返回返回不可修改的集合,但您的类必须进行适当的编码才能获得您想要的行为。
相应的 getter 总是创建成员对象的新副本
理论上是的,实际上这并不能保证,通常会被优化掉。
出于性能原因,我想防止这种情况发生。
如果您来自 C++,您可能会发现您在 C++ 中担心的许多问题在 Java 中都不是问题(反之亦然;)
如果您认为 JIT 将优化掉所有简单的 getter,因此没有性能开销,您可能会发现以下简单形式就是您所需要的。
private int x; // non-final so it can be changed
// or better
private final int x; // makes it clear the field will not be changed.
public int getX() { return x; }
final
使用与否的区别不在于性能,而在于清晰度。