gpt4 book ai didi

java - Java 中的对象和引用

转载 作者:行者123 更新时间:2023-12-04 15:03:54 25 4
gpt4 key购买 nike

在 Java 中,所有变量都是按值传递的。对于对象,这意味着我们传递对象的引用。我对以下情况感到困惑。假设我们有一个对象图。一个对象包含对另一个对象的字段引用,该对象引用了另一个对象,例如:user.address.city。这里我们有类用户的实例,该实例引用了 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 和 Bob 开始一起住在一所房子里,并且他们有相同的地址,没问题:

mary.setAddress(bobAddress);

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

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

这里我们遇到了一个问题:玛丽更改了地址中的内容,但她也改变了鲍勃的地址,因为它们共享相同的引用。

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

最佳答案

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

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

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

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

关于java - Java 中的对象和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com