覆盖 var 上的 setter

2023-11-22

一个小问题,希望有一个小答案:

我有一个var在我的班级中,每当设置时都需要触发某种更新。我知道一个var隐式地获取两个方法,一个 getter 和一个 setter。是否可以以某种方式重写 setter 方法以确保触发更新,而不需要递归?我是说

def a_=(x: Any) = { a = x; update }

可能会是无限递归,对吗?

The var只在类外设置并且只在类内读取,也许这有帮助。

感谢收听。


您的代码永远不会是无限递归,因为它无法编译。由于编译器隐式创建了 Getter 和 Setter,因此您不能两次创建此类方法。我不知道编译器是否有原因不检查 Getter 或 Setter 是否存在,只有在不存在此类方法时才创建此类方法。

您可以通过重命名私有变量来避免此问题:

class X(private var _i: Int) {
  def i = _i
  def i_=(i: Int) {
    println(i)
    _i = i
  }
}

这些方法与编译器生成的方法具有相同的签名。

If the update只有当您可以在伴生对象中执行此操作时,才可以调用方法:

object X {
  def apply(i: Int) = {
    update
    new X(i)
  }
}
class X(i: Int)

你有什么理由不喜欢不可变的对象吗?如果不是,可以复制旧值,同时设置一个新值:

case class X(i: Int, j: Int)
val x1 = X(3, 6)
val x2 = x1.copy(i = 1) // x2 = X(1,6)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 var 上的 setter 的相关文章

随机推荐

  • SockJS Python 客户端

    我有一个依赖 Websockets 的网站 Java Spring 践踏 Websocket对于 Spring RabbitMQ SockJS 的某些功能 我们正在创建一个基于 Python 的命令行界面 我们希望添加一些使用 websoc
  • 从 WPF 中的 ViewModel 类(MVVM 模式)更新 UI

    我在我的第一个 WPF 应用程序中使用 MVVM 模式 并且我认为有一些非常基本的问题 当用户点击我的视图上的 保存 按钮时 将执行一个命令 该命令调用我的 ViewModel 中的 private void Save 问题是 Save 中
  • 在 Google Colab 上使用最新的 Python 版本

    Google Colab 安装了 Python 3 6 但它不是当前版本的 Python 我该如何在 Google Colab 上将 Python 升级到最新版本 常见问题解答说 Colaboratory 支持 Python 2 7 和 P
  • 在 Linux 上构建和使用用于 C++ 的纯 llvm 工具链

    假设这是可能的 有人可以告诉我 我如何配置 cmake 构建以在 ubuntu 16 04 上创建一个 纯 llvm 工具链 其中包括 clang lld libc libc abi libunwind llvm 编译器 rt 任何其他可能
  • 避免窗口获得焦点

    我正在使用虚拟键盘 问题是当我按下虚拟键盘上的按键时 需要发送数据的窗口会失去焦点 我怎样才能避免这种情况 当键盘窗体接收焦点时 它接收的部分消息是失去焦点的窗口的句柄 wParam 执行您需要执行的操作 并将焦点设置回失去焦点的窗口 编辑
  • 实数 - 如何确定是否需要 float 或 double?

    给定一个真实值 我们可以检查是否float数据类型足以存储数字 或者double是必须的 我知道精度因架构而异 是否有任何 C C 函数可以确定正确的数据类型 有关背景 请参阅每个计算机科学家都应该了解的浮点运算知识 不幸的是 我认为没有任
  • style,格式化切片运算符

    PEP 8没有提到切片运算符 据我了解 与其他运算符不同 它不应该被空格包围 spam 3 5 OK spam 3 5 NOT OK 当使用复杂的表达式时 这是否成立 即哪种风格被认为更好 1 spam ham 66 3 44 eggs 2
  • 如何实例化不同版本的 InternetExplorerDriver - Selenium 2?

    只是想知道如何实例化不同版本的 InternetExplorerDriver 这就是我创建 IE 驱动程序的方法 WebDriver ieWebDriver new InternetExplorerDriver 但我无法区分 IE6 IE7
  • Java中如何计算整数的尾随零? (例如:234000 => 3 个零)

    标题几乎是不言自明的 1232 gt 0 1231030 gt 1 2000 gt 3 34444400000 gt 5 如果它适合一个int long 只需检查模 10 的数字是否为 0 并保留一个计数器 long x if x 0 re
  • 如果我将变量“close”全局定义为“0”,为什么它会被记录为“false”?

    我知道这一定是非常基本的东西 但我不明白范围是如何工作的 我想要closed变量在整个 JavaScript 文件中都是已知的 我有类似的东西 在 jQuery 中 var closed 0 function console log clo
  • Youtube Iframe 没有全屏按钮

    也许是星期五下午 但由于某种原因 我似乎无法在嵌入的 Youtube 视频上显示全屏按钮 我所做的只是复制从 Youtube 视频生成的共享代码 例如使用这段代码http jsfiddle net chricholson v8sjL I s
  • java 正则表达式中捕获组的行为混乱

    In this answer我推荐使用 s replaceFirst 0 d 0 1 但有两个人抱怨结果包含字符串 null 例如 23 null 这可以解释为 1 i e group 1 being null 可以通过以下方式进行转换St
  • 如何在java中创建合成字段?

    如何在 Java 中创建合成字段 java中的合成字段只能在运行时创建吗 如果没有 在编译时是否有符合标准的方法 无需更改类文件中的某些字节 当语言的 奇怪之处 需要它们时 它们是由编译器创建的 一个简单的例子是使用内部类 public c
  • PhP中如何检查mysql条目是否为空?

    这是我从表中回显的描述变量 description mysql result result i description 有时第 i 条记录是空的并且没有任何数据 没有描述 我想要做的是对空记录回显 没有可用的描述 if isset desc
  • ROAuth 不再使用 httr? [推特API]

    我在 AWS Ubuntu Server 12 04 2 LTS 上运行 R Studio 并通过浏览器访问 R Studio 当我尝试使用该包在 Twitter API 上进行身份验证时ROAuth与代码 credential lt OA
  • Angular 2 - 带有 formControlName 的 ng-bootstrap 下拉菜单

    有没有办法使ng bootstrap 下拉控件使用 Angular 反应形式 Given div class d inline block div
  • 在 iOS 中的特定时间唤醒应用程序

    我需要构建一个具有闹钟功能的应用程序 这意味着用户将能够设置应用程序唤醒并执行某些操作的时间 我看到我可以发布并捕获本地推送通知 但我需要在应用程序唤醒时运行一些代码 iOS 提供这种行为吗 谢谢 不可以 您无法在本地唤醒应用程序 但在 i
  • 如何从二维数组中删除重复项? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个二维数组 7 3 7 3 3 8 7 3 7 3 1 2 有什么聪明的方法可以从中删除重复的元素吗 它应该返回这样的数组 7 3 3 8 1 2 Thanks arr 7 3
  • 为什么Java中没有静态类

    我是java新手 当我查看语言规范时 我发现不能声明静态类 但我们可以拥有静态内部类 我有点困惑为什么我们不能拥有顶级静态类 如果我想创建一个仅包含实用方法的类 我可以选择静态类 Java 开发人员限制此功能的原因是什么 这不是限制 你可以
  • 覆盖 var 上的 setter

    一个小问题 希望有一个小答案 我有一个var在我的班级中 每当设置时都需要触发某种更新 我知道一个var隐式地获取两个方法 一个 getter 和一个 setter 是否可以以某种方式重写 setter 方法以确保触发更新 而不需要递归 我