加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何将构造函数变量(sic!)公开为只读?

发布时间:2020-12-16 08:59:22 所属栏目:安全 来源:网络整理
导读:我有关于 Scala的这个相当简单的问题.鉴于我必须遵循类定义: class Foo(var bar: Int) 能够构造Foo实例的代码必须能够传递bar的初始值.但是如果我将bar定义为var,那么User也可以在运行时更改其值,这不是我想要的.用户应该只能阅读栏. bar本身在内部被修改,
我有关于 Scala的这个相当简单的问题.鉴于我必须遵循类定义:

class Foo(var bar: Int)

能够构造Foo实例的代码必须能够传递bar的初始值.但是如果我将bar定义为var,那么User也可以在运行时更改其值,这不是我想要的.用户应该只能阅读栏. bar本身在内部被修改,因此val不是一个选项.

解决方法

对于属性的只读很简单,只需创建一个没有相应setter的getter方法.私人可修改的领域也很容易.

您最大的挑战是共享命名空间,您希望能够使用相同的名称:

>构造函数参数
>内部可修改的字段
>公众的吸气鬼
>私人二传手

遗憾的是,这是不可能的,你需要为每个角色都有一个独特的名称……这样的事情:

class Bippy(bop0: Int) {
  private[this] var privatebop = bop0
  //privatebop is ONLY EVER used by the following getter and setter:
  private def bop_=(x:Int) = privatebop = x
  def bar = privatebop
}

如果您不关心使用命名参数,或者使用Scaladoc中的参数名称,那么可以进一步缩短:

class Bippy(private[this] var privatebop) {
  //privatebop is ONLY EVER used by the following getter and setter:
  private def bop_=(x:Int) = privatebop = x
  def bop = privatebop
}

UPDATE

可以说,最干净的方法是给你一个命名参数,它是将工厂与上述技术之一结合起来:

object Bippy{
  def apply(bop: Int) = new Bippy(bop)
}

然后可以将其称为Bippy(42).与常规构造函数相同,但没有new关键字.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读