【问题标题】:Using scala constants in constant expressions在常量表达式中使用 scala 常量
【发布时间】: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


【解决方案1】:

我在 JPA 中使用 scala 中的常量。此代码编译,我使用它:

FreeDays.scala

@Entity
@Table(name = "free_days")
@NamedQueries(
  Array(
    new NamedQuery(name = JpaQueries.IS_FREE_DAYS, query = "SELECT f FROM FreeDays f WHERE f.dateOfFreeDay = :" + JpaQueries.DATE)
  )
)
class FreeDays {

  def this(id: Int, name: String, dateOfFreeDay: Date) = {
    this()
    this.id = id
    this.name = name
    this.dateOfFreeDay = dateOfFreeDay
  }

  @Id
  @GeneratedValue
  var id: Long = _

  var name: String = _

  @Column(name = "date_of_free_day")
  @Temporal(TemporalType.DATE)
  var dateOfFreeDay: Date = _
}

JpaQueries.scala

object JpaQueries extends JpaQueries

sealed trait JpaQueries {
  final val IS_FREE_DAYS = "IS_FREE_DAYS"
  final val DATE = "date"
}

【讨论】:

  • 在摆弄了一些构建配置之后,我认为这实际上是一个 scala-ide 特定问题。当我使用 gradle 或 sbt 构建项目时,代码确实可以编译。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2019-09-14
  • 2013-03-22
  • 1970-01-01
  • 2017-08-20
相关资源
最近更新 更多