【问题标题】:Support for "Undo Method Calls" in JVM支持 JVM 中的“撤消方法调用”
【发布时间】:2011-03-29 10:05:38
【问题描述】:

有什么方法可以撤销 Java 中方法调用的影响?我正在尝试解决以下问题。我有一组 Java 对象,我们称它们为 object1、object2 等。在我的程序中,我按以下顺序调用这些对象中的方法:

...

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

object2.method1();

object1.method2(); ...

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

我了解这意味着我需要执行以下操作:

...

object1.UNDOmethod2();

object2.UNDOmethod1();

object1.UNDOmethod1();

...

但我正在寻找一个无需自己编写撤消方法的解决方案?我假设 JVM 会有信息来做到这一点..这可能吗?

谢谢一百万。

【问题讨论】:

    标签: java jvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          您可以使用 Spring Transaction 或 JTA 来做到这一点。但是,我不认为这是一个简单的答案。 相反,我会使用以下方法。

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

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

          【讨论】:

            猜你喜欢
            • 2010-09-14
            • 1970-01-01
            • 2015-12-29
            • 2012-11-27
            • 1970-01-01
            • 1970-01-01
            • 2021-06-17
            • 2021-12-23
            • 2014-02-16
            相关资源
            最近更新 更多