java - 如何在 Scala 中制作功能齐全的不可变类?

标签 java scala copy prototype

我注意到 Scala 有案例类。这些似乎是用于模式匹配的,但我喜欢我可以用它们来做到这一点:

val bankAccount1 = new BankAccount("Daniel", 100)
val bankAccount2 = bankAccount1.copy(funds = 200)

现在“丹尼尔”有两个银行账户,一个有 100 美元,一个有 200 美元。但是当事情变得更复杂时,BankAccount 需要被子类化,而这不起作用,因为案例类不能扩展其他案例类。

我想要不可变的类,而不是可以扩展到更多不可变的类。就像我希望能够扩展 BankAccount 以拥有不可变的子类 SavingsBankAccountCheckingBankAccount。我不确定此时是否需要扩展/实现 Clonable 接口(interface)或定义自定义复制方法或类似的东西。我不想在类(class)中放置太多样板文件。

(如果可能),我如何在 Scala 中创建可以复制和子类化并且不会过于困惑或冗长的不可变类?

最佳答案

我认为在 Scala 中执行此操作的惯用方法是使用封装而不是继承。例如你可以:

case class BankAccount(id: AccountId, customer: Customer)
case class SavingsBankAccount(account: BankAccount, line: SavingsLine)

这样您就可以保持不变性和自动应用、取消应用、equals、hashCode 和复制方法生成的良好特性。

但是,如果您真的想使用继承,您别无选择,只能推出您自己的自定义解决方案。例如,实现一个特征 SubclassableCaseClass,它实现辅助方法以快速定义方法案例类,免费提供给您。

关于java - 如何在 Scala 中制作功能齐全的不可变类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33333650/

相关文章:

java - 如何通过基于 Java 的配置在 Hibernate 中的查询上使用分页

java - influxdb-java : org. influxdb.InfluxDBIOException : java.net.SocketException:连接由对等方重置:套接字写入错误

objective-c - 克隆或复制 UIViewController 或 UIView

windows - 如果通过计划任务调用 BAT 文件,则无法将文件复制到 UNC 目标

html - 如何将 CSS 复制到 Chrome 中的另一个选项卡?

java - 为什么 Sprite 会抽搐?

java - pdfbox - 转换为灰度后 pdf 增加大小

scala - 在Scala中反转 map (字符串->列表)

scala - 仅减少/折叠一些元素

scala - 假人的 Akka Actors 单元测试