scala - 如何更改案例类的基类属性
问题描述
采取以下代码:
class A(val i: Int)
case class B(str: String) extends A(1)
val b = B("test")
在我的场景中,我受到无法更改的 B 定义的限制。我也希望避免重构 B,因为我有许多这样的对象,它们的属性比这个例子中的要多得多。
有什么方法可以创建一个新的 b 副本(使用反射或其他方式),并为 i 设置一个新值?
相当于:
val b2 = b.copy(i = 2)
注意:问题是可以做到吗?不是最好的编程实践。
解决方案
您可以使用反射来做到这一点,如下所示:
val b = B("foo")
val c = b.copy()
println(b.i) // prints 1
val field = classOf[A].getDeclaredFields.head
field.setAccessible(true)
field.setInt(c, 2)
println(c.i) // prints 2
但请注意,这不仅仅是“糟糕的编程习惯”,而是完全违反合同。
您的声明case class B(s: Sting) extends A(1)
承诺所有实例B
将始终i
等于 1,这是一个谎言。
更不用说,有趣的事实,比如b == c
成为true
或c.copy.i
成为 1 等。不要这样做。
推荐阅读
- java - Java中同步/易失的可变可见性影响程度是多少
- ruby-on-rails - 适用于帖子的相同redirect_to 路由不适用于评论(相同的网址)
- authentication - GCP Cloud Router 不支持 BGP 身份验证吗?
- javascript - 在 GrapesJS 中将组件添加到 blockManager
- javascript - Javascript - .push() 多个对象从 for 循环到多维数组
- java - 使用 Axis 1.4 客户端的 NTLM 代理身份验证
- sql - 当 SQL 中的两个值具有不同的数据类型时,如何将它们与给定的十进制精度进行比较?
- r - 向量化霍夫丁的距离
- excel - Cuberankedmember 得到错误的顺序
- java - 为什么 Date 对象不代表我的 JVM 时区中的日期?