Java中的对象和引用
在Java中,所有变量都是通过值传递的。 对于对象, 这意味着我们在对象上传递引用。 我对以下情况感到困惑。 假设我们有一个对象图。 一个对象包含对另一个对象的字段引用, 该对象引用了另一个对象,如:user.address.city。 这里有类User的实例, 该实例引用了类地址的实例,该类地址的字段类型为String-city。 现在假设我们有2个用户:Java中的对象和引用,java,object,reference,Java,Object,Reference,在Java中,所有变量都是通过值传递的。 对于对象, 这意味着我们在对象上传递引用。 我对以下情况感到困惑。 假设我们有一个对象图。 一个对象包含对另一个对象的字段引用, 该对象引用了另一个对象,如:user.address.city。 这里有类User的实例, 该实例引用了类地址的实例,该类地址的字段类型为String-city。 现在假设我们有2个用户: User bob = new User(); User mary = new User(); 假设对象“bob”引用了地址对象: Add
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引用了一个address对象。
但有一天他们离婚了,玛丽现在有了另一个地址:
mary.getAddress().setCity("Boston");
这里我们有一个问题:
玛丽改变了她的地址,
但她也改变了鲍勃的地址,
因为它们共享相同的引用
以上所有文字都是我试图以小规模描述我面临的一个大问题:
在将某个对象的引用设置到另一个实例之前,何时应该创建该对象的副本(克隆)?
是否存在一些规则或技术?
我知道不可变对象(例如字符串、整数…)对于这些对象,我们根本不需要考虑这些问题,但是如果我有可变对象呢。
我该如何对待他们?我认为你的想法是错误的 如果玛丽搬家,那意味着她将去一个新的地址。试着把它放到Java中。您只需为Mary创建另一个地址 在我看来,如果同一个对象是同一个对象,就永远不应该为赋值克隆同一个对象。(您可以进行一些处理计算)
只需减少耦合并使用mary.setAddress(字符串streeName、字符串City、字符串State)。通常一个地址的城市不应该改变,因为街道不能从一个城市移动到另一个城市,因此你甚至不应该有一个setCity()公共方法。你的问题表明
地址类的设计不好
Address类表示地理位置,并且是固定的。
当一个人移动时,
地理位置不变;相反
ghe个体居住的地理位置发生变化
删除Address的setters并使其成为不可变对象。
当一个人移动时,
您必须执行以下操作之一:
如果个人与另一个人共享现有地址(对象实例),则分配现有引用
如果个人移动到新地址(新对象实例),则将该地址分配给新地址实例
可能比我的答案措辞更好+1@Ajk_P你的答案是正确的,但你可能还没有使用过不变性的概念。这绝对是这个框架的方式。它在高度并发和函数式编程中非常重要。当不变的事物(如地址的城市或日期的年份)在代码中也不变时,生活就会变得更轻松。你完全理解了机制/语言。但是你是对的,你的设计会产生这个问题,因此不起作用。因此,我对设计修正案投了赞成票。