Поддержка "Отменить вызовы метода" в JVM - PullRequest
1 голос
/ 29 марта 2011

Есть ли способ отменить эффекты вызова метода в Java? Я пытаюсь решить следующую проблему. У меня есть набор Java-объектов, давайте назовем их object1, object2 и т. Д. В моей программе я вызываю методы этих объектов в следующем порядке:

...

object1.method1 (); // Я предполагаю, что JVM знает внутреннее состояние до и после этого вызова

object2.method1 ();

object1.method2 (); ...

Я хочу достичь начального состояния программы, не зная, что на самом деле вызывал метод. Позволяет ли JVM вернуться в состояние до вызова object1.method1 ()?

Я понимаю, что это означает, что мне нужно сделать следующее:

...

object1.UNDOmethod2 ();

object2.UNDOmethod1 ();

object1.UNDOmethod1 ();

...

Но я ищу решение без необходимости самостоятельно писать методы отмены? Я предполагаю, что у JVM будет информация, чтобы сделать это .. это возможно?

Спасибо миллион.

Ответы [ 4 ]

2 голосов
/ 29 марта 2011

Рассмотрите возможность использования реализации Java Программная транзакционная память , например Deuce STM . Конкретно, Deuce полагается на использование инструментария Java. Если вы можете изменить свою реализацию для изменения только одной структуры данных в результате нескольких вызовов методов, рассмотрите возможность использования Transactional Maps из Apache.

1 голос
/ 29 марта 2011

Я думаю, что это невозможно. Также есть вещи, которые вы просто не можете отменить: побочные эффекты . Например, system.out.println("hello world!"): после того, как JVM выполнила это, вы не сможете отменить его.

Я думаю, что вы можете отменить изменения в вашей модели данных (или значения), которые произошли после выполнения какого-либо метода. В этом случае вы можете использовать Шаблоны команд и / или Memento (или их комбинацию).

1 голос
/ 29 марта 2011

Короткий ответ - нет.JVM не предоставляет автоматические контрольные точки состояния, которые можно откатить.

Однако вы можете посмотреть на Continuations как способ добиться этого.Затем вы можете явно записать состояние программы между каждым вызовом метода, а затем вернуться к продолжению, которое представляет историческое состояние, когда вам нужно отменить.См. Следующие ресурсы для получения дополнительной информации о продолжениях в Java:

0 голосов
/ 29 марта 2011

Вы можете сделать это с помощью Spring Transaction или JTA.Однако я не вижу в этом простого ответа.Вместо этого я бы использовал следующий подход.

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

execute1 () и execute2 () не могут выдать ошибку или выполнить откат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...