特定
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.colourRun Code Online (Sandbox Code Playgroud)
我正在使用IntelliJ.
这是一个奇怪的用例.如果不推荐使用必填字段,那么该类本身也必须弃用,当然?也就是说,假设你正在试图做什么是可能的,这是不可能使用的类都没有得到一个弃用警告.(这可能解释了为什么不可能.)
也就是说,正如您所指出的那样,有很多方法可以实现您的目标.这是其中之一:
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
如果这不起作用,你能解释为什么需要弃用该字段吗?
您的第一个版本似乎工作正常:如果您粘贴
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 代码中显示错误和警告是相当不可靠的,您应该始终通过实际构建项目来进行检查。