2013-07-20 2 views
0

Я хотел бы найти решение для компиляции, чтобы удалить метод finalize моих классов в соответствии с флагом. Это делается для того, чтобы избежать performances issues с GC.#ifdef для Java, чтобы удалить функцию завершения во время компиляции

Моя система сборки ANT.

В принципе, я хочу эквивалент этой C-препроцессора макрос:

#ifdef USE_FINALIZE 
protected finalize() { 
    ... 
} 
#endif 

Возможно ли это в Java?

ответ

0

Согласно Javadoc

Метод финализации класса Object не выполняет никаких специальных действий; он просто возвращается нормально. Подклассы объекта могут переопределять это определение.

Это означает, что

а) вы не делаете никаких специальных финализации, если вы не явно объявляя его в коде, и

б) Если вы не включают финализации () метод Object.finalize() будет вызываться, который не является оператором. Таким образом, вы не можете улучшить это, если не сможете каким-то образом взломать jvm, чтобы даже не завершить финализацию.

Возможно, лучший вопрос: есть ли у вас конкретная причина беспокоиться о времени завершения в вашем приложении? вы профилировали это? Вполне возможно, что это не проблема в вашем приложении.

+0

Как мой проект использует JNI, я должен освободить родные объекты в 'finalize'. Хотя я не сравнивал это, я думаю, что это может сильно снизить производительность в моем случае (много jni => java calls + GC за короткий период времени). Таким образом, согласно вашей ссылке с javadoc, лучшее решение известно, чтобы реализовать «финализацию» и полагаться на статический флаг для выполнения или не действия нативного удаления. Отличный ответ, это именно то, что я хотел. –

0

Короткий ответ заключается в том, что для этого не существует встроенного способа. См. Java conditional compilation: how to prevent code chunks from being compiled? для получения более подробной информации.

Однако вы можете создать собственное решение с использованием Ant, используя replace task. Чтобы сделать это, вы можете просто добавить некоторую магическую строку в комментарии вокруг блоков, которые вы хотите иногда включать.

/******CONDITIONAL****** 

// conditional code goes here 

*******CONDITIONAL*****/ 

Затем используйте замену, чтобы удалить эти комментарии, основываясь на некоторых условных свойствах.

0

Возможно, возможно, с обработчиком аннотаций (не уверенным) во время компиляции, используя зеркало api, но, возможно, это будет трудно.

Возможно, это возможно во время выполнения тоже с Javassist или CGLIB