我有一组复杂的特征和案例类,但为了讨论起见,让我总结一下我试图以这种方式建模的内容:
case class X(x: X)
Run Code Online (Sandbox Code Playgroud)
这很好,直到我最终以这种方式初始化其中一个实例:
val myX: X = X(myX)
Run Code Online (Sandbox Code Playgroud)
它编译(令人难以置信),但myX传递给构造函数的实际上是null,通过myX.x事后检查很容易看到。
假设有一个指向自身的实例对于我要建模的内容来说很好,是否有一种优雅的方法来解决这个问题并让新实例X指向自身?我的意思是没有在创建后改变对象,也没有引入不带参数并this在内部使用的第二个构造函数。请记住,实际情况比这里描述的要复杂。
如果你需要一个案例类,我认为它不能完成。Case 类不能有惰性参数,如果它们可以指向自己,那么它们的大部分方法可能会炸毁堆栈。通过常规课程,您可以这样做:
scala> class X(x0: =>X) {
| lazy val x = x0
| }
class X
scala> val x: X = new X(x)
val x: X = X@5f98cb6f
scala> x.x
val res0: X = X@5f98cb6f
scala> x.x.x
val res1: X = X@5f98cb6f
Run Code Online (Sandbox Code Playgroud)
如果您想要类似案例类的行为,您必须自己实现样板(应用、取消应用、复制、等于、哈希码等),并且要非常小心,不要触发无限循环或堆栈溢出。
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |