Java中的对象和引用

时间:2014-09-25 20:19:06

标签: java object reference

在Java中,所有变量都按值传递。 对于物体, 这意味着我们传递对象的引用。 我对以下情况感到困惑。 假设我们有一个对象图。 一个对象包含另一个对象的字段引用, 该对象引用了另一个对象,例如:user.address.city。 这里我们有类User的实例, 该实例引用了类Address的实例,该类具有String类型的字段 - city。 现在假设我们有2个用户:

User bob = new User();
User mary = new User();

假设对象'bob'引用了地址对象:

Address bobAddress = new Address();
bobAddress.setCity("New York");

bob.setAddress(bobAddress);

让我们说玛丽和鲍勃开始住在一个房子里,他们有相同的地址, 没问题:

mary.setAddress(bobAddress);

现在mary和bob引用了一个地址对象。 但有一天,他们离婚,玛丽现在有另一个地址:

mary.getAddress().setCity("Boston");

这里有一个问题: 玛丽改变了她的地址, 但她也改变了鲍勃的地址, 因为他们有相同的参考。

以上所有文字都是我试图以小规模描述一个大问题: 我应该在将该对象的引用设置为另一个实例之前创建某个对象的副本(克隆)吗? 是否存在某些规则或技术? 我知道使用这些对象的不可变对象(例如String,Integer ...),我们根本不需要考虑这些问题,但如果我有可变对象怎么办。 我应该如何表现?

2 个答案:

答案 0 :(得分:7)

您的问题表明Address类的设计不合理。

Address类表示地理位置并已修复。 当一个人移动时, 地理位置不变;代替, 个人居住的地理位置发生变化。

删除Address的setter并使其成为不可变对象。 当一个人移动时, 您必须执行以下操作之一:

  1. 如果个人与另一个人共享现有地址(对象实例),则分配现有参考。
  2. 如果个人移动到新地址(新对象实例),则将地址分配给新的地址实例。

答案 1 :(得分:1)

我认为你的想法已经结束了。

如果玛丽移动,这意味着她将转到一个新地址。试着把它放到Java中。您只需要为Mary创建另一个地址。

IMO,如果它是相同的对象,你永远不应该为分配克隆相同的对象。 (你可以进行一些处理计算)。

只需减少耦合并拥有mary.setAddress(String streeName,String City,String State)。通常地址的城市不应该改变,因为街道不能从一个城市移动到另一个城市,所以你甚至不应该有一个setCity()公共方法。