Я отвечаю за обслуживание старого приложения, написанного на Swing, в сочетании с CAD-подобным инструментом, написанным на Java3D.У нас проблемы с использованием памяти .После профилирования это связано с функциональностью отмены в приложении.
Все функции отмены основаны на состоянии, с базовой концепцией, такой как:
public class UndoAction {
private UndoTarget target;
private Object old_data;
private Object new_data;
}
Код для создания этих действий отмены:в основном замусорено на протяжении всего приложения.Поскольку не существует различий между модификациями новых объектов, модификациями существующих объектов и модификациями поддеревьев, происходит следующее:
То, что происходит при одном действии, является следующим:
- Создатьновый объект
A
. - Изменить поле
foo
объекта.Новый UndoAction помещается в стек, который содержит foo_old и foo_new. - Изменить поле
bar
объекта.Новое действие UndoAction помещается в стек, который содержит bar_old и bar_new. - Execute
B.setField(A)
.Новое действие UndoAction помещается в стек, который содержит field_old и field_new (== A).
Нет детализации или какого-либо контроля над этим вообще.Это совсем не помогает в обслуживании.
Я хочу реорганизовать эту систему, чтобы она стала удобной для обслуживания и памяти.К сожалению, реализация системы отмены с использованием шаблона Command невозможна;действия слишком влиятельны, чтобы вернуться.Я хочу реализовать следующее:
- Используйте аннотации для предоставления «Отменить демаркацию».@Undoable () помечает метод как генерирующий UndoAction, который помещается в стек.Это может быть параметризовано так же, как транзакции: REQUIRE, NEST, JOIN ... Полный граф объекта клонируется при входе в метод Undoable.
- Когда транзакция (= метод) завершается, алгоритм должен сравнивать новое состояниесо старым состоянием и сохранением различий.
- Для реализации этого мы можем использовать АОП.Это позволяет нам поддерживать основной код в чистоте.
Теперь мой вопрос: Существует ли какая-либо из 3 вышеупомянутых функций в Java?Я могу себе представить, что я не первый, кто борется с отменой на основе состояния и связанными с этим проблемами (Отмена разграничения, сравнение состояний, ...)