gpt4 book ai didi

java - 如何在 Java 的可运行类中保持对象参数不变?

转载 作者:搜寻专家 更新时间:2023-10-31 20:30:27 25 4
gpt4 key购买 nike

我有一个 Runnable 类:

Class R1 implements Runnable {
private static final Log LOGGER = LogFactory.getLog(R1.class);
private final ObjectClass obj;
private final SomeService service;

public R1(ObjectClass obj, SomeService service) {
this.obj = obj;
this.service = service;
}

@override
public void run() {
String value = this.obj.getSomeValue();
LOGGER.debug("Value is " + value);
// some actions, such as:
// service.someMethod(obj);
}
}

我使用 ExecutorService 对象来执行 R1 并将 R1 放入队列中。但后来在 R1 之外,我更改了我在 R1 中传递的 ObjectClass 中的值,因此 getSomeValue() 之后 R1 中的操作并不像我预期的那样运行。如果我想保持 R1 中 ObjectClass 对象的值不变,我该怎么办?假设对象很大并且有很多get和set方法。

为了使问题更清楚,我需要将 obj 传递给服务类对象,该对象也用作可运行类中的参数。我相应地更改了原始代码。

最佳答案

根据评论,显然我建议的解决方案有问题。

因此,请遵循有关创建新实例和复制所需属性的其他建议。或者创建一个轻量级数据对象来保存您需要的属性。无论哪种方式,我相信你需要 2 个实例来做你想做的事。


我建议您可以实现创建新实例的克隆方法。

http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Cloneable.html

这里的问题是您已将实例传递到 R1 类中,但它仍然是同一个实例,因此对它的更改会影响其他所有内容。因此,实现克隆方法将使您能够轻松创建可在 R1 类中使用的实例副本,同时允许您对原始实例进行进一步更改。

在你的 R1 类中,

public R1(ObjectClass obj) {
//this.obj = obj;
this.obj = obj.clone();
}

附言你必须自己实现这个方法。它不会自动为您提供深拷贝。

关于java - 如何在 Java 的可运行类中保持对象参数不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7479612/

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