【发布时间】:2011-12-05 17:02:45
【问题描述】:
我注意到在一些 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 会完全消失吗?请注意,在此示例中,我希望从类中删除该方法,因为我不希望它被调用。
第二部分:我已经看到it suggested 这用于消除调试日志记录代码。鉴于大多数框架(尤其是 log4j)允许运行时设置日志级别,我认为这不是一个好的用例。就个人而言,我希望保留此代码。那么除了Predef 中的assert() 方法,@elidable 有什么好的用例?
【问题讨论】:
标签: scala