gpt4 book ai didi

java - Java 的值传递是否意味着我的类不需要 deepCopy 函数?

转载 作者:行者123 更新时间:2023-12-01 22:43:28 26 4
gpt4 key购买 nike

我很难让我的一些代码工作。代码以 SwingWorker 开头并得到结果。我无法将数据传递给工作人员并从工作人员那里获取信息。

我要传递的数据由我自己定义的类的对象组成。例如,我有两个 ItemInventory目的。 Item对象基本上包含所有原始类型(名称、价格等)和 Inventory包含 LinkedListItem s。

我不太记得导致我的健全性检查的一系列事件,但作为健全性检查,我实现了 Item.getDeepCopy(Item inItem)Inventory.getDeepCopy(Inventory)函数,以便我可以传递 Item 的副本s 和 Inventory给我的 worker 。需要这个吗?

我如何使用深层复制功能是当我将数据传递到我的 StringWorker 并从中获取数据时。 s。假设我通过单击按钮启动了一个工作人员。在事件处理程序中,我首先获得了我的类的深拷贝 Inventory 的私有(private)本地副本或 Item并将其传递给 worker 构造函数。它是否正确?我需要传递深拷贝吗?我想不是..

我这样做是因为担心工作人员会尝试修改工作人员本身对对象的类引用,从而导致一些线程问题。但是经过一些阅读和批判性思考后,情况并非如此,因为 java 是按值传递的,所以传递给 worker 的内容不可能导致 GUI 组件数据发生变化。这是正确的想法吗?

然后当工作人员完成时,它会调用一个被覆盖的 done我写的方法。此方法在 EDT 上运行,因此我可以从我的 GUI 组件调用函数,即我调用的函数 WorkerDone(boolean result, Inventory outInv) .工作程序调用此函数并传递(不是深拷贝)其本地副本 InventoryItem回到图形用户界面。当 GUI 获取它时,它会执行深层复制并设置其本地 InventoryItem到这个值。这对深拷贝有用吗?

编辑:再来一点。

基本上我想将“一些数据”传递给工作人员并允许它在没有与 GUI 组件链接的情况下工作。当工作人员完成时,它要么成功完成,要么不成功。如果成功,我想从工作人员那里“取回”数据,并用返回的数据更新我的本地副本。我不希望工作人员“触摸”GUI 中的任何数据。

对于可变性。我希望能够在创建对象后更改对象中的数据。考虑到这一点,这就是我构建应用程序的方式。我想要的不是非可变对象来保证线程安全,我只是不希望线程交互。我想向工作人员传递一些数据,基本上“忘记我发送了它”,然后当工作人员完成并调用 GUI 的 workerDone方法 GUI 只是同意将其数据的本地副本设置为返回对象的值,如果工作人员说它成功了。

编辑 2:

只是为了更清楚地理解传递值和传递引用这两个短语。当我看到按值传递时我的想法。假设我想按值(value)传递一个苹果,为此我会将我的苹果放在一台克隆机中,该机器在各个方面都对苹果进行完全相同的克隆,然后传递那个苹果。不管是谁通过了这个克隆的苹果,它都可以用它做任何事情,并且不会影响我最初的苹果。

当我看到 pass-by-reference 时,我想到的是,如果我想通过引用传递我的申请,我会在一张纸上写下我的苹果在哪里,然后通过它。任何收到这张纸的人都可以到我的苹果所在的地方咬一口。

所以我的困惑来自“Java is pass-by-value”,如果是,那么为什么我必须担心我的工作人员在对传递给它的值进行操作时会导致线程冲突?

最佳答案

Java 是按值传递的,但是当您传递一个对象时,您传递的是一个引用,并且只是该引用的一个副本。原始和副本这两个引用仍然引用堆中的同一组值。

担心您无法控制可能修改对象的代码是有效的,但您可以将该对象包装在另一个无法更改的对象中,或者指定一个具有提取方法但没有设置方法的接口(interface)。

如果您可以更新数据,并且在更新显示它的数据的中途,让 GUI 拥有自己的数据副本可能会很有用。如果您不担心这种不一致,您可能只想在 gui 代码和非 gui 代码之间共享相同的引用以保持代码简单(假设您的类是线程安全的)。

关于java - Java 的值传递是否意味着我的类不需要 deepCopy 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25729804/

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