Стратегия сбора мусора Java-объектов, созданных с помощью пользовательских функций электронных таблиц OpenOffice - PullRequest
0 голосов
/ 23 июля 2011

Я написал надстройку OpenOffice / LibreOffice, которая реализует некоторые пользовательские функции электронных таблиц Calc в Java. Некоторые из этих функций создают объекты Java, которые затем логически связываются с результатом функции и, таким образом, также связываются с ячейкой, в которой используется функция.

(Предполагая, что функция вызывается из формулы ячейки, а не из мастера функций или другого контекста).

OpenOffice не сообщает пользовательским функциям, из какой ячейки они вызываются, поэтому выяснить эту связь нелегко. Если параметры функции являются адресами ячеек, то можно посмотреть на эти ячейки и найти ячейки, которые зависят от них - это сужает возможности.

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

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

Я ищу чистый способ обнаружить, что логическая ссылка на объект исчезла (поскольку экземпляр функции вызывался с другими аргументами или формула, содержащая функцию, была удалена или изменена).

Edit: Возвращение XVolatileResult выглядело многообещающе, однако обратный вызов removeResultListener () никогда не вызывается при удалении формулы (кроме случаев закрытия документа).

Еще несколько уточнений: Пользовательская функция реализована как метод экземпляра компонента Uno (в одном компоненте может быть несколько пользовательских функций). Создается только один экземпляр компонента.

Метод функции вызывается со строковыми или числовыми аргументами, соответствующими аргументам в формуле электронной таблицы. Также возможно получить аргументы как ссылки на ячейки, а не как значения.

Результатом функции является строковое или числовое значение или XVolatileResult. Невозможно вернуть произвольный объект Java.

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

...