我有一个 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/