有没有办法撤消Java中方法调用的效果?我试图解决以下问题。我有一组Java对象,让我们称它们为object1,object2等。在我的程序中,我按以下顺序调用这些对象中的方法:
...
object1.method1(); //我假设JVM知道此调用之前和之后的内部状态
object2.method1();
object1.method2(); ...
我想实现程序的初始状态,而不必知道方法调用实际上做了什么。在调用object1.method1()之前,JVM是否允许我返回状态?
我知道这意味着我需要执行以下操作:
...
object1.UNDOmethod2();
object2.UNDOmethod1();
object1.UNDOmethod1();
...
但我正在寻找一个解决方案,而不必自己编写撤消方法?我假设JVM会有这样的信息。这可能吗?
万分感谢。
答案 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()不能抛出错误或回滚。