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

Posted

技术标签:

【中文标题】在 Scala 注释中使用常量的最佳实践【英文标题】:Best practice for use constants in scala annotations 【发布时间】:2011-05-03 18:17:02 【问题描述】:

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

例如,

公共接口 SymbolConstants 静态字符串 DEFAULT_TIMEOUT_KEY = "default.timeout"; 公共类 AppModule 无效贡献应用程序默认(配置配置) conf.add(SymbolConstants.DEFAULT_TIMEOUT_KEY, "10"); 公共类 MyComponent @Symbol(SymbolConstants.DEFAULT_VALUE_KEY) 私人长时间超时;

定义静态常量并将它们用作注释值的能力使我能够进行编译时检查。

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

【问题讨论】:

【参考方案1】:

需要'final' 关键字才能使编译器像在Java 中那样发出它。例如,

object Foo

   final val MY_SYMBOLIC_CONSTANT="whatever"

看来,否则,您只能在后台获得一个不可静态计算的访问器方法。

【讨论】:

在 Scala 2.10.3 中为我工作! 这在 Scala 2.10.x 和 Scala 2.11.x 中运行良好——只要确保你没有添加类型注释。如果这样做,似乎 scala 编译器决定将常量编译为方法而不是静态最终变量。 在此处查看@extempore 的答案以获取更多背景/示例:***.com/questions/19938803/… 在 scala 2.12.3 中对我来说很好 适用于 2.12.2【参考方案2】:

似乎不可能使用 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")

.

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

【讨论】:

它不起作用,因为 SuppressWarnings 需要一个数组。如果您使用其他注释。有用。尝试使用@SerialVersionUID。 scala-lang.org/node/106

以上是关于在 Scala 注释中使用常量的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中维护常量的最佳实践

使用常量数据反应最佳实践

组织多个 scala 相互关联的 sbt 和 git 项目 - 最佳实践建议

scala - 最佳实践(02) - 代码洁癖

常量表设计 MySQL 最佳实践

Ruby 类方法或常量,最佳实践