实际上可以弃用Scala案例类字段吗?

spi*_*x-i 7 scala case-class

特定

case class Fruit(name: String, colour: String)
Run Code Online (Sandbox Code Playgroud)

我想弃用案例类字段colour.

我试图通过使用Scala来实现前者 @deprecated

case class Fruit(name: String, @deprecated("message", "since") colour: String)
Run Code Online (Sandbox Code Playgroud)

和Java @Deprecated注释

case class Fruit(
  name: String, 
  /* @Deprecated with some message here */
  @(Deprecated @field) 
  colour: String
)
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法colour在任何情况下弃用,我无法找到任何资源.

实际上,我可以使用其他方法实现相同的任务,例如将我的case类放宽到普通类并提供getterfor colour并使后者弃用,但我想知道是否实际上不可能弃用case类字段而且 -最终 - 原因.

谢谢.


UPDATE

正如迈克正确指出的那样,colour是一个案例类的必填字段,因此设置此属性的意义deprecated是有争议的.我想弃用colour,因为我现在提供colour来自另一个构造的信息,我想让用户知道这colour不是获取该信息的正确实例,我将Fruit在下一个版本中将其删除.

到目前为止,我只是警告用户不要colour从Fruit属性中获取信息,暂时,我并不关心他们是否可以创建带有颜色信息的水果实例.


更新2

正如阿列克谢所说,我在编译时确实有被弃用的警告.但是为什么我不能在IDE代码中观察到弃用以及我弃用某个方法呢?我期待以下的东西

val fruit = Fruit("peer", "green")
val colour = fruit.colour
Run Code Online (Sandbox Code Playgroud)

我正在使用IntelliJ.

Mik*_*len 5

这是一个奇怪的用例.如果不推荐使用必填字段,那么该类本身也必须弃用,当然?也就是说,假设你正在试图做什么是可能的,这是不可能使用的类没有得到一个弃用警告.(这可能解释了为什么不可能.)

也就是说,正如您所指出的那样,有很多方法可以实现您的目标.这是其中之一:

case class Fruit(name: String) {

  @deprecated("message", "since")
  val colour: String = "some default value"
}

object Fruit {

  // Deprecated factory method.
  @deprecated("message", "since")
  def apply(name: String,  colour: String): Fruit = Fruit(name)
}
Run Code Online (Sandbox Code Playgroud)

显然,这假设colour不再需要作为属性Fruit.(如果必需的,则不应该弃用它.)它通过弃用创建使用值的工厂方法来工作.Fruitcolour

如果这不起作用,你能解释为什么需要弃用该字段吗?


Ale*_*nov 5

您的第一个版本似乎工作正常:如果您粘贴

case class Fruit(name: String, @deprecated("message", "since") colour: String)

println(Fruit("", "").colour)
Run Code Online (Sandbox Code Playgroud)

https://scastie.scala-lang.org/,您会看到弃用警告。当然,您需要访问该字段,无论是直接访问还是通过提取器:

Fruit("", "") match { case Fruit(x, y) => y }
Run Code Online (Sandbox Code Playgroud)

也会警告。

IDEA 没有显示colour为已弃用,我相信这只是一个错误。一般来说,在内嵌 Scala 代码中显示错误和警告是相当不可靠的,您应该始终通过实际构建项目来进行检查。

  • 为什么这会成为一个问题呢?创建实例不会访问已弃用的字段。如果您想要该警告,请弃用该类。 (3认同)