在scala注释中使用常量的最佳实践

Yun*_* Ho 16 java scala constants

我使用tapestry 5作为我选择的Web框架.Tapestry允许我在configure类中定义符号并将符号注入其他组件.

例如,

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;
}

定义静态常量并将它们用作注释值的能力为我提供了编译时检查.

我想知道如何定义常量并将它们用作scala注释的值.如果不是,那么定义/限制我们可以为scala中的注释分配的值的最佳做法是什么.

F. *_*ely 20

需要'final'关键字使编译器像在Java中一样发出它.例如,

object Foo
{
   final val MY_SYMBOLIC_CONSTANT="whatever"
}
Run Code Online (Sandbox Code Playgroud)

看起来,否则,你只能在引擎盖下获得一个不可静态计算的存取方法.

  • 这在Scala 2.10.x和Scala 2.11.x中工作正常 - 只是确保不添加类型注释.如果这样做,似乎scala编译器决定将常量编译为方法而不是静态最终变量. (9认同)

Jay*_*lor 1

对于 scala 版本 2.8.1.final、2.8.2.final 或 2.9.1.final 似乎不可能(结果与所有版本相同):

object Constant { val UNCHECKED = "unchecked" }

class Test {                                       
    @SuppressWarnings(Array(Constant.UNCHECKED))   
    def test: Unit = println("testing.. 1, 2... 3")
}
Run Code Online (Sandbox Code Playgroud)

<console>:7: error: annotation argument needs to be a constant; found: Constant.UNCHECKED
           @SuppressWarnings(Array(Constant.UNCHECKED))
Run Code Online (Sandbox Code Playgroud)