斯卡拉的私人领域制定者
发布时间:2020-12-16 18:07:25 所属栏目:安全 来源:网络整理
导读:在 scala中使用类字段的最佳方法是在类之外是只读的吗?我意识到我可以这样做: private var myvalX = 0 // default valdef myval = myvalXdef myval_=(x: Int) { myvalX = x } 但是我觉得它非常难看,因为_ =运算符以及你需要定义一个名称与方法不同的单独va
在
scala中使用类字段的最佳方法是在类之外是只读的吗?我意识到我可以这样做:
private var myvalX = 0 // default val def myval = myvalX def myval_=(x: Int) { myvalX = x } 但是我觉得它非常难看,因为_ =运算符以及你需要定义一个名称与方法不同的单独var.替代品将非常受欢迎.谢谢! 解决方法
我认为将私有字段和公共字段共享同名是不错的做法.例如,你写道
private var myvalX = 0 // default val def myval = myvalX def myval_=(x: Int) { myvalX = x } 这根本不会让myval成为只读!你可能意味着像 private def myval_=(x: Int) { myvalX = x } 这是只读的.但这是一个很好的例子,说明为什么这是一个坏主意 – 你要求公共接口和私人实现细节之间的混淆.可能出现的其他问题是用户没有意识到值可能会从它们下面改变,子类重新定义公共getter而没有意识到私有setter不可用,等等. 如果您不尝试共享该名称,则更清楚的是有两件事需要考虑:您的基础数据以及依赖于该数据的公共接口. private var myData = 0 def data = myData 那不是那么糟糕,是吗? 或者,如果你真的坚持使用这种模式,你可以使用各种技巧使事情看起来更好.例如,如果你有一堆字段,你可以 class C { abstract class ReadOnly[A] { def value: A } private class ReadWrite[A](var value: A) extends ReadOnly[A] private implicit def access[A](ro: ReadOnly[A]) = ro.asInstanceOf[ReadWrite[A]] def rw[A](a: A): ReadOnly[A] = new ReadWrite(a) val data = rw(0) val comment = rw("Ho-hum") } 这将使C类中的任何内容设置data.value和comment.value,并且只允许其他人阅读它们. (编辑:修改为包含原始示例中的所有好东西,因为如果省略它们,则可能会出错.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |