Я заметил в некотором коде библиотеки scala, особенно Predef
, есть код вроде:
/** Tests an expression, throwing an `AssertionError` if false.
* Calls to this method will not be generated if `-Xelide-below`
* is at least `ASSERTION`.
*
* @see elidable
* @param p the expression to test
*/
@elidable(ASSERTION)
def assert(assertion: Boolean) {
if (!assertion)
throw new java.lang.AssertionError("assertion failed")
}
Эта аннотация позволяет мне во время компиляции исключить код. Когда я компилирую с помощью -Xelide-below MAXIMUM
, делает ли это
- удалить метод и все его вызовы? (Если это так, что произойдет, если другая библиотека ожидает, что этот метод будет там?), Получаем ли мы NoSuchMethodError или что-то еще?
- оставьте метод там, но удалите весь код из метода, оставив пустой метод?
- просто удалите вызовы метода, но оставьте там метод?
Можно ли использовать его для уменьшения скомпилированного размера класса? Поэтому, если бы у меня было:
class Foobar {
// extremely expensive toString method for debugging purposes
@elidable(FINE) def toString(): String = "xxx"
}
и скомпилирован с помощью -Xelide-below WARNING
, будет ли toString в этом классе вообще исчезнуть? Обратите внимание, что в этом примере я хотел бы, чтобы метод был удален из класса, потому что я не хотел бы, чтобы он вызывался.
Вторая часть: я видел он предложил, что это будет использоваться для устранения кода регистрации отладки. Учитывая, что большинство фреймворков (log4j заметно) позволяют установить уровень ведения журнала во время выполнения, я не думаю, что это хороший вариант использования. Лично я хотел бы, чтобы этот код поддерживался. Итак, помимо методов assert() в Predef
, что является хорошим вариантом использования для @elidable
?