3

也许我仍然错过了一个重要的概念。

为了允许读取和防止写入非原始成员,相应的 getter 总是创建成员对象的新副本。出于性能原因,我想防止这种情况发生。我正在尝试编写一个基于四叉树的带有碰撞检测的简单 2D 模拟器,这将是生计。

我认为在 C++ 中我可以通过返回一个 const 来做到这一点。(我知道我可以用强制转换覆盖它)但我不确定这是如何在 JAVA 中完成的。

有任何想法吗?

4

3 回答 3

3

有几种方法可以归档您想做的事情。

const首先,对于C++ 中的功能没有语言支持。

无论如何,我建议您使用 Getter 和 Setter,因为它们不会造成任何开销。Java 即时优化处理了这一点。

对于非原始类型,您仍然会遇到返回的对象本身可能会被更改的问题。有三种方法可以防止这种情况。

  1. 您根本不返回对象。您通过父对象中的多个 getter 提供存储在对象内部的数据。
  2. 您使用不可变对象或不可变视图。因此,通常无法更改的对象或仅提供对象视图但会阻止 setter 对象的对象。
  3. 您使用克隆或复制构造函数返回原始对象的副本。
于 2012-09-17T12:03:03.723 回答
2

您可以自由地使任何自定义引用类型不可变。

你是说你克隆每个对象?您可能有堆问题。我更喜欢不可变的解决方案。它是线程安全的,内存占用更少。

Java 中没有对 C++ return const 的语言支持。您可以返回返回不可修改的集合,但您的类必须进行适当的编码才能获得您想要的行为。

于 2012-09-17T11:55:49.893 回答
1

相应的 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使用与否的区别不在于性能,而在于清晰度。

于 2012-09-17T11:56:33.483 回答