【发布时间】:2014-07-04 22:14:20
【问题描述】:
我有常量,它们是由其他更小的常量组成的。例如
object MyConstants {
final val TABLENAME = "table_name";
final val FIELDNAME = "field_name";
final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix"; // this one does not want to be constant
}
我希望这些是真正的常量,因为我在注释中使用它们。
如何让它发挥作用? (在 Scala 2.11 上)
我想要的是
interface MyConstants {
String TABLENAME = "table_name";
String FIELDNAME = "field_name";
String INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}
但在 scala 中。如果 Scalac 从 java 类/接口 (see SI-5333) 编译它们,它不会在注释中使用常量,所以我决定将它们放在 scala 对象中。它适用于文字和带有文字的表达式,但不适用于带有其他常量的表达式。
使用此代码:
import javax.persistence.Entity
import javax.persistence.Table
import org.hibernate.annotations.Index
object MyConstants {
final val TABLENAME = "table_name";
final val FIELDNAME = "field_name";
final val INDEXNAME = TABLENAME + "_" + FIELDNAME + "_ix";
}
@Entity
@Table(name = MyConstants.TABLENAME)
@org.hibernate.annotations.Table(
appliesTo = MyConstants.TABLENAME,
indexes = Array(new Index(name = MyConstants.INDEXNAME, columnNames = Array(MyConstants.FIELDNAME))))
class MyEntity {
}
我在indexes = ... 行收到以下错误
注解参数需要是一个常数;找到:MyConstants.INDEXNAME
编辑: 在摆弄了一些构建配置之后,我认为这实际上是一个 scala-ide 特定问题。当我使用 gradle 或 sbt 构建项目时,代码确实可以编译。我确实在我的实际项目中使用构建工具,所以最终它是关于在 IDE 中有一些难以理解的标记 - 烦人,但与功能无关。
【问题讨论】:
-
真常数是什么意思,如何衡量什么是真常数,什么不是?
-
如果它在编译时可解析,它是一个真正的常量。不知道scala编译器是否会这样做。
-
@sschaef 我的意思是编译成与java的
static final字段相同的字节码并且可以在注释中使用的常量。 -
您的意思是要从 Java 访问它们吗?
-
@sschaef 在我的帖子中澄清了一点。我想在 Scala 代码的注释中使用它们。
标签: scala annotations constants