支持JVM中的“撤消方法调用”

时间:2011-03-29 10:05:38

标签: java jvm

有没有办法撤消Java中方法调用的效果?我试图解决以下问题。我有一组Java对象,让我们称它们为object1,object2等。在我的程序中,我按以下顺序调用这些对象中的方法:

...

object1.method1(); //我假设JVM知道此调用之前和之后的内部状态

object2.method1();

object1.method2(); ...

我想实现程序的初始状态,而不必知道方法调用实际上做了什么。在调用object1.method1()之前,JVM是否允许我返回状态?

我知道这意味着我需要执行以下操作:

...

object1.UNDOmethod2();

object2.UNDOmethod1();

object1.UNDOmethod1();

...

但我正在寻找一个解决方案,而不必自己编写撤消方法?我假设JVM会有这样的信息。这可能吗?

万分感谢。

4 个答案:

答案 0 :(得分:2)

考虑使用Software Transactional Memory的Java实现,例如Deuce STM。具体而言,Deuce依赖于使用Java工具。如果您可以通过多次方法调用更改实现以仅修改单个数据结构,请考虑使用Apache中的Transactional Maps

答案 1 :(得分:1)

简短的回答是否定的。 JVM不提供可以回滚的状态自动检查点。

你可以将Continuations视为实现这一目标的一种方式。然后,您可以在每个方法调用之间显式捕获程序状态,然后在需要撤消时回滚到表示历史状态的continuation。有关Java中的延续的更多信息,请参阅以下资源:

答案 2 :(得分:1)

我认为这是不可能的。此外,有些内容无法撤消:side effects。例如system.out.println("hello world!"):一旦JVM执行了它,你就不可能撤消它。

我认为您可能想要撤消对执行某些方法后发生的数据模型(或值)的更改。在这种情况下,您可能需要使用Command patterns和/或Memento(或两者的组合)。

答案 3 :(得分:0)

您可以使用Spring Transaction或JTA执行此操作。但是,我不认为这是一个简单的答案。 相反,我会使用以下方法。

if(object1.isOkay1() && object2.isOkay2()) {
   object1.perform1();
   object2.perform2();
} else {
   // something went wrong.
}

perform1()和perform2()不能抛出错误或回滚。