繁体   English   中英

Java中的对象和引用

[英]Objects and references in Java

在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");

在这里我们遇到了一个问题:Mary在她的地址中改变了一些内容,但她也更改了Bob的地址,因为他们共享相同的引用。

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

您的问题表明Address类的设计不正确。

Address类表示地理位置并且是固定的。 当个人移动时,地理位置不会改变; 相反,个人居住的地理位置会发生变化。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM