scala – 实例化具有要为其成员设置的值的案例类
发布时间:2020-12-16 18:35:24 所属栏目:安全 来源:网络整理
导读:考虑这个案例类 case class sample(val s: String = { /*compiled code*/ }){ val name:String = { /*compiled code*/ } val no:Int = { /*compiled code*/ }} 我需要创建此类的实例,并将特定值设置为name和no. 但是我不能使用扩展这个类的另一个类.我必须传
考虑这个案例类
case class sample(val s: String = { /*compiled code*/ }) { val name:String = { /*compiled code*/ } val no:Int = { /*compiled code*/ } } 我需要创建此类的实例,并将特定值设置为name和no. 解决方法
你的意思是有人已经遇到了确保名称和没有设置特定方式并且无法更改的麻烦,并且你想让它们包含其他东西,这可能违反了各种各样的假设?这不是一个好主意,JVM会阻止你做一些如此愚蠢的事情(除非涉及到所有内容的自定义类加载器的荒谬困难技巧).
如果你只是想要设置那些val,但通常不必在构造函数中担心它们,那么有各种各样的解决方案.一个是使用lazy vals和私有vars与setter: case class C(val s: String = "fish") { private var myN: Option[Int] = None def initializeN(n0: Int) { myN = Some(n0) if (n != n0) throw new Exception("Already initialized") } lazy val n: Int = myN.getOrElse(s.length) // s.length is your code block } 哪个是这样的: scala> C("salmon") res0: C = C(salmon) scala> res0.initializeN(2); res0.n res1: Int = 2 scala> C("herring") res1: C = C(herring) scala> res1.n res2: Int = 5 scala> res1.initializeN(2) java.lang.Exception: Already initialized at C.initializeN(<console>:11) ... 如果你想要初始化的编译时安全性,你可以玩各种其他技巧.以后的参数块可以引用较早的参数块,并且不会显示为匹配参数: case class D(val s: String = "fish")(val n: Int = s.length) {} 您可以重载构造函数: case class E(val s: String,n: Int) { def this(s: String) = this(s,s.length) def this() = this("fish") } 以及上述的各种混合物也是可能的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |