构造函数中常量的用法

时间:2016-10-29 11:09:47

标签: scala

这很可能是一个愚蠢的问题,我在这里看到了答案,但似乎在我的特定情况下不起作用。这是我的代码

object ProductAdded{
  val PRODUCT_NAME:String="productName"
  val PRODUCT_PRICE:String="productPrice"
}

class ProductAdded @JsonCreator()(@JsonProperty(PRODUCT_NAME) var productName: String,
                                  @JsonProperty(PRODUCT_PRICE) var productPrice: String) extends Event {


  @JsonProperty(PRODUCT_NAME) def getProductName: String = {
    productName
  }

  @JsonProperty(PRODUCT_PRICE) def getProductPrice: String = {
    productPrice
  }
}

我试图在构造函数中使用这些常量,但是当我编译时显示此错误

Error:(12, 49) annotation argument needs to be a constant; found: event.ProductAdded.PRODUCT_NAME
class ProductAdded @JsonCreator()(@JsonProperty(PRODUCT_NAME) var productName: String,

1 个答案:

答案 0 :(得分:4)

这是一个非常不幸的错误信息,我必须说,因为Scala实际上并没有一个名为“常量”的概念,所以如果你甚至不知道它是什么,你应该怎么做一些“常数”是

Scala 但是有一个概念“constant expression”(粗略强调我的):

  

6.24常量表达式

     

常量表达式是Scala编译器可以计算为常量的表达式。 “常量表达式”的定义取决于平台,但它们至少包括以下形式的表达式:

     
      
  • 值类的文字,例如整数
  •   
  • 字符串文字
  •   
  • 使用Predef.classOf
  • 构建的类   
  • 来自底层平台的枚举元素
  •   
  • 一个文字数组,格式为Array(c 1 ,...,c n ),其中所有c i 都是本身就是常量表达式
  •   
  • 常量值定义 定义的标识符。
  •   

和“constant value definition”(粗体强调我的):

  

常量值定义的格式为

final val x = e
     

其中e常量表达式必须存在final修饰符且不能给出类型注释

因此,正如您所看到的,您的表达式不是常量值表达式,因为该定义不是常量值定义

要将其转换为常量值定义,您需要

  • 删除类型注释: String
  • 明确添加final修饰符 :即使单身object的成员隐式 final常量值定义需要显式注释

结果看起来像这样:

object ProductAdded {
  final val PRODUCT_NAME  = "productName"
  final val PRODUCT_PRICE = "productPrice"
}

class ProductAdded @JsonCreator()(
  @JsonProperty(PRODUCT_NAME)  var productName:  String,
  @JsonProperty(PRODUCT_PRICE) var productPrice: String
) extends Event {
  @JsonProperty(PRODUCT_NAME)  def getProductName  = productName
  @JsonProperty(PRODUCT_PRICE) def getProductPrice = productPrice
}