Reputation: 181
I use tapestry 5 as my choice of web framework. Tapestry allows me to define symbols in the configure class and inject symbols into other components.
for example,
public interface SymbolConstants { static String DEFAULT_TIMEOUT_KEY = "default.timeout"; } public class AppModule { void contributeApplicationDefault(Configuration conf) { conf.add(SymbolConstants.DEFAULT_TIMEOUT_KEY, "10"); } } public class MyComponent { @Symbol(SymbolConstants.DEFAULT_VALUE_KEY) private long timeout; }
The ability to define static constants and use them as annotation values gives me compile time check.
I am wondering how to define constants and use them as values of scala annotations. If not, what is the best practice to define/limit the value that we can assign to annotations in scala.
Upvotes: 18
Views: 9217
Reputation: 1134
The 'final' keyword is required to make the compiler emit it as you would do it in Java. E.g.,
object Foo
{
final val MY_SYMBOLIC_CONSTANT="whatever"
}
It seems that, otherwise, you only get an accessor method under the hood which is not statically calculable.
Upvotes: 23
Reputation: 13562
It doesn't seem possible w/ scala versions 2.8.1.final, 2.8.2.final, or 2.9.1.final (the result was the same with all):
object Constant { val UNCHECKED = "unchecked" }
class Test {
@SuppressWarnings(Array(Constant.UNCHECKED))
def test: Unit = println("testing.. 1, 2... 3")
}
.
<console>:7: error: annotation argument needs to be a constant; found: Constant.UNCHECKED
@SuppressWarnings(Array(Constant.UNCHECKED))
Upvotes: 1