作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我注意到 Scala 有案例类。这些似乎是用于模式匹配的,但我喜欢我可以用它们来做到这一点:
val bankAccount1 = new BankAccount("Daniel", 100)
val bankAccount2 = bankAccount1.copy(funds = 200)
现在“丹尼尔”有两个银行账户,一个有 100 美元,一个有 200 美元。但是当事情变得更复杂时,BankAccount
需要被子类化,而这不起作用,因为案例类不能扩展其他案例类。
我想要不可变的类,而不是可以扩展到更多不可变的类。就像我希望能够扩展 BankAccount
以拥有不可变的子类 SavingsBankAccount
和 CheckingBankAccount
。我不确定此时是否需要扩展/实现 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/
我是一名优秀的程序员,十分优秀!