在Scala中是否可以使用命名常量?

6

看起来Java中的注释需要常量。我想要做:

object ConfigStatics {
  final val componentsToScan = Array("com.example")
}

@PropertySource( ConfigStatics.componentsToScan )   // error: constant value required
class MyConfig extends WebMvcConfigurerAdapter {
}

在哪里

@PropertySource( Array("com.example") ) 
class MyConfig extends WebMvcConfigurerAdapter {
}

很遗憾,Scala不认可静态final val作为常量值。

在这里有什么可以做的,或者说在Scala中是否不可能拥有命名常量?

没问题。

2个回答

4

您的componentstoScan不是常量,我可以更改其中包含的值:

object ConfigStatics {
  final val componentsToScan = Array("com.example")
  componentsToScan(0) = "com.sksamuel"
}

这将起作用。
object ConfigStatics {
  final val componentsToScan = "com.example"
}

@PropertySource(Array(ConfigStatics.componentsToScan))
class MyConfig extends WebMvcConfigurerAdapter {
}

你是在说编译器证明提供的类型不是常量,因为它有setter方法吗?还是它只是使用关于哪些内置类型是不可变的知识?到底什么决定了一个常量? - user48956
我不是完全确定,但Som-snytt的答案涉及更多细节。 - sksamuel

4

这看起来像是一个 Bug。

根据 SLS 6.24 规定,字面量数组 Array(c1, c2, ...) 是一个常量表达式。

根据 SLS 4.1 规定,一个常量值定义 final val x = e 意味着 x 被替换为 e

然而事实并不是这样的,因此这可能是一项规范 Bug 或实现 Bug。

  final val j = Array(1,2,3)
  def k = j  // j
  final val x = 3
  def y = x  // 3

这是一个重复的问题,与此问题相同,retronym承诺会为此问题开立一张工单。

那是三年前的事了。我想知道他的终端上是否仍有黄色的便条?


看起来答案是否定的。 - user48956

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接