覆盖 Kotlin 数据类的 getter

2024-04-29

给定以下 Kotlin 类:

data class Test(val value: Int)

我将如何覆盖Intgetter 以便如果值为负数则返回 0?

如果这是不可能的,有哪些技术可以达到合适的结果?


在花了几乎一整年的时间每天编写 Kotlin 后,我发现尝试像这样覆盖数据类是一种不好的做法。有 3 种有效的方法,在我介绍它们之后,我将解释为什么其他答案建议的方法不好。

  1. 拥有创建的业务逻辑data class在使用错误值调用构造函数之前,将该值更改为 0 或更大。这可能是大多数情况下的最佳方法。

  2. 不要使用data class。使用常规的class并让您的 IDE 生成equals and hashCode适合您的方法(或者如果您不需要它们,则不需要)。是的,如果对象的任何属性发生更改,您将必须重新生成它,但您可以完全控制该对象。

    class Test(value: Int) {
      val value: Int = value
        get() = if (field < 0) 0 else field
    
      override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Test) return false
        return true
      }
    
      override fun hashCode(): Int {
        return javaClass.hashCode()
      }
    }
    
  3. 在对象上创建一个额外的安全属性来执行您想要的操作,而不是使用有效覆盖的私有值。

    data class Test(val value: Int) {
      val safeValue: Int
        get() = if (value < 0) 0 else value
    }
    

其他答案建议的一个不好的方法:

data class Test(private val _value: Int) {
  val value: Int
    get() = if (_value < 0) 0 else _value
}

这种方法的问题在于数据类 https://kotlinlang.org/docs/reference/data-classes.html实际上并不是为了像这样改变数据。它们实际上只是用于保存数据。重写像这样的数据类的 getter 意味着Test(0) and Test(-1)不会equal彼此之间会有不同的hashCodes,但是当你打电话时.value,他们会得到相同的结果。这是不一致的,虽然它可能对您有用,但您团队中的其他人看到这是一个数据类,可能会意外地误用它,而没有意识到您如何更改它/使其无法按预期工作(即,这种方法不会t 正常工作Map or a Set).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖 Kotlin 数据类的 getter 的相关文章

  • SecurityException: getSerial: 用户 10134 不满足访问设备标识符的要求

    我想从 Android 手机获取 Build getSerial 在 Android O 之前 我需要 Manifest permission READ PHONE STATE 权限 但是在 Android 10 中我遇到了上述异常 我所做
  • 如何在可组合项中使用 hilt 注入单例

    我正在尝试注入一个在可组合项内的 hiltmodule 中定义的单例类 我知道如何注入视图模型 但是单例类呢 Inject lateinit var mysingleton MySingletonClass 该代码在活动中运行良好 但将其从
  • 如何使用分页库在回收器视图中添加日期分隔符?

    经过大量搜索 我知道使用常规适配器是可能的 但我不知道如何使用分页库来做到这一点 我不需要代码 只是一个线索 Example 要添加分隔符 您基本上有两个选择 基于视图 您显式地将分隔符作为 项目 包含在列表中 并为这些分隔符定义新的视图类
  • Jetpack Compose - 布局可重用组件

    为了练习 Jetpack Compose 中的可重用组件 我开始了一些练习 见下图 正如我想象的那样 绿色行 输入行以及之间的行具有相同的结构 第一个元素获得了可用空间 第二个元素获得了 50 dp 最后一个元素获得了 70 dp 我尝试将
  • 如何从屏幕上的任意位置拖动底页?

    我正在尝试实现类似 YouTube 的体验 并允许用户从屏幕中的任何位置拖动底部工作表 我尝试了很多解决方案没有任何帮助 我终于从这个解决方案中找到了解决方案在外部区域达到阈值后允许 BottomSheet 向上滑动 https stack
  • Kotlin 数据类中可变集合的防御性副本

    我想要一个接受只读列表的数据类 data class Notebook val notes List
  • Kotlin:使用地图变换时 {} 和 () 之间的区别?

    我是科特林新手 我总是使用带花括号的地图变换 然后 为什么这有效 gt val x someList map SomeConstructor 这不是吗 val x someList map SomeConstructor 我在在线教程的任何
  • 具有自定义计数标准的 RxJava 缓冲区/窗口

    我有一个 Observable 它发出许多对象 我想使用以下方法对这些对象进行分组 window or buffer运营 但是 不是指定count用于确定窗口中应有多少对象的参数我希望能够使用自定义标准 例如 假设可观察对象正在发出 a 的
  • Kotlin 中是否可以为 mutableStateOf() 提供自定义设置器

    我想在每次设置某个状态后两秒进行一些操作 viewModel 内的代码 var isLoading mutableStateOf LoadingState NONE set value Timber d Custom Setter Not
  • 作用域函数 apply/with/run/also/let:它们的名字从何而来?

    有很多博客文章 例如this https dzone com articles examining kotlins also apply let run and with intentions 关于标准库函数的用法apply with ru
  • “android.enableUnitTestBinaryResources”已弃用[重复]

    这个问题在这里已经有答案了 我刚刚更新了我的 Android Studio 现在当我构建我的项目时 我收到此错误 选项 android enableUnitTestBinaryResources 已弃用 这 当前默认值为 假 已从当前版本中
  • groovy 无法解析 kotlin 类

    由于我无法解决我遇到的问题kotlin 我决定回到groovy为了实现该插件 但是我遇到了这个问题 我有这样的项目结构 为了不重写所有类 我决定重用中实现的类kotlin 然而我的课FileProcessingCoreGroovy Down
  • 从 Kotlin 中的字符串中删除字符

    我正在尝试创建一个使用 Kotlin 中的字符串的 Android 计算器 如果逗号 或负数 已经包含一个 我不知道如何删除它 这是我的代码 它正确添加逗号 但如果用户再次单击则不会删除它 if buClickValue contains
  • Ktor 如何处理空响应

    我使用 Ktor 和这样的线路myentity client get url 从 API 响应获取并反序列化我的实体 当 API 返回某些内容时它工作正常 但是一旦 API 没有任何可返回的内容并发送 HTTP 204 响应 它就会失败并显
  • 如何在Android首选项中正确接收和存储本地目录/路径?

    我想存储一个本地路径 内部或外部存储 用户可以在其中存储一些数据作为 Android 应用程序中的首选项 我希望用户在首选项中选择一个首选文件夹 默认文件夹是context externalMediaDirs它返回一个File我将其绝对路径
  • 在 Kotlin 中创建 Spring 的 ParameterizedTypeReference 实例

    我正在尝试学习 Kotlin 并测试它如何与 Spring Boot 配合使用 我的应用程序使用 mongo 数据库来存储数据 并且我有用于检索数据的 Jersey 资源 我正在使用它进行测试spring boot test and Res
  • Moshi 无法解析 nullable

    你好 希望你能帮助我 使用 kotlin Retrofit2 moshi 我从 https api spacexdata com v3 launches 获取数据并解析它 一切都很顺利 我得到的属性如下 flight number miss
  • 用于 Kotlin 中单元测试的 BuildConfigField 模拟

    我正在尝试尽可能多地涵盖Kotlin Android 库我遇到了有关自定义 BuildConfig 变量的问题 更广为人知的是buildConfigField 我想模拟这个变量来测试两者true and false values 从 Gra
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 如何从DataSource.Factory获取数据

    我必须调用此方法才能获取所有人员 我根本无法修改这个方法 Query SELECT FROM PERSON TABLE ORDER BY NAME DESC abstract fun getElements DataSource Facto

随机推荐

  • Visual Studio Community 2015 安装失败

    最近安装了VS 2015 windows 10 但是出现了一些包失败的情况 稍后详述 当尝试启动新项目时 我收到一条错误消息 无法创建编译器 所以我卸载并修复了微软可再发行组件并再次尝试 从那以后我根本无法安装VS 我收到以下消息 Rosl
  • 如何用CGAL获取多边形网格的顶点和面?

    With CGAL 我能够得到一个多面体网格OFF格式 例如 下面的程序构建两个四面体 计算它们的交集 并将结果返回到OFF文件 这OFF输出提供顶点坐标和顶点索引给出的面 但我想将顶点和面作为 C 变量 例如double顶点向量和int面
  • 当我们点击编辑器外部时如何隐藏ckeditor?

    这是我的代码 div div
  • Firebase 3 - 附加身份验证范围数据

    在 Firebase 3 文档中 他们说您可以获取其他范围数据 例如 可选 指定您想要从身份验证提供程序请求的其他 OAuth 2 0 范围 要添加范围 请调用 addScope 例如 provider addScope https www
  • 如何读取 stripe webhook 响应 [重复]

    这个问题在这里已经有答案了 我创建了 Coldfusion 文件来捕获 STRIPE Webhook 响应
  • 如何在 android studio 中监听 shell 命令的响应?

    在 Android 终端模拟器中 我可以输入以下命令 gt su gt echo class power supply battery charge rate 根据手机的充电方式 输出将为 无 正常 或 涡轮 我希望能够检索此输出并存储它作
  • PHP: Datetime::Diff 结果比较

    我试图比较两个日期之间的差异 但结果似乎非常错误 例如以下代码 datetime1 new DateTime 2009 10 11 datetime2 new DateTime 2009 10 13 interval datetime1 g
  • PostgreSQL 中列名包含冒号的问题

    我从 OSM 下载了形状数据 我已将数据从 Shapefile 导入到 PostgreSQL 没有任何问题 但在执行 select 语句时出现错误 Select addr city From location Error syntax er
  • Kubernetes - 向 kube dns 中的匿名用户授予 RBAC 访问权限

    我有一个带有主节点和工作节点的 Kubernetes 集群设置 Kubectl cluster info 显示 kubernetes master 以及 kube dns 成功运行 我正在尝试访问下面的 URL 因为它是我的组织内部的 所以
  • 打开浏览器开发者工具会影响应用程序性能吗?

    我想知道打开浏览器开发人员工具是否真的会以任何方式影响应用程序性能 这不仅仅是考虑在同一窗口中打开开发人员工具 它可以在新窗口或同一窗口中 如果开发人员工具未打开与打开状态相比 应用程序渲染 性能是否有任何差异 打开开发人员工具肯定会影响性
  • 如何在片段之间传递数据

    我试图在程序中的两个片段之间传递数据 它只是存储在列表中的一个简单字符串 列表在片段 A 中公开 当用户单击列表项时 我需要它在片段 B 中显示 内容提供程序似乎只支持 ID 因此这不起作用 有什么建议么 为什么不使用捆绑包呢 从您的第一个
  • 计算嵌套列表的深度或最深级别

    A 在一项作业上遇到了真正的问题 并且令人头疼 我正在上一堂入门编程课 我必须编写一个函数 给定一个列表 该函数将返回它所达到的 最大 深度 例如 1 2 3 将返回 1 1 2 3 将返回 2 我写了这段代码 这是我能得到的最好的T T
  • Mysql正则表达式搜索不包含重复字符

    我有一个数据库表 其中包含字典中的单词 现在我想选择字谜词 例如 如果我给出字符串SEPIAN它应该获取像这样的值apes pain pains pies pines sepia etc 为此 我使用了查询 SELECT FROM word
  • 如何在 compose 中正确加载 svg 图像?

    我试图在 Jetpack compose 中加载 SVG 文件 但当我在手机上运行它时 它变成了黑色 这是我手机上的图像 我不想用tint修改器 因为它将以单一颜色加载 SVG Use Image可组合而不是Icon 图标默认进行着色 So
  • Firefox 中有 XDomainRequest 等效项吗?

    Firefox 或任何其他浏览器中是否有与 Internet Explorer 的 XDomainRequest 等效的功能 我想访问我的域之外的服务 网站 Internet Explorer 8 中的 XDomainRequest 对象是
  • 下拉菜单的 iframe z-index

    我有下拉菜单的代码 我的目标是通过 iFrame 加载该代码 不幸的是 我无法弄清楚如何使用 Z 索引加载 iFrame 外部的视图元素 代码如下
  • 如何在 PHP 中从serializeArray 获取 POST 值?

    我正在尝试这个我见过的新方法serializeArray with ajax var data form input serializeArray post var action process data data ajax etc 这样我
  • 如何在 VS 2012 中获取水晶报表?

    我对 VS 2012 有疑问 即我想创建一个报告 例如特定学生的结果 我搜索了很多然后我知道我必须安装SAP Crystal Report 并且我已经这样做了 但工具箱中仍然没有水晶报表 只有两个项目 名为 报表 报表向导 有人可以帮我弄这
  • Action Cables、嵌套 JSON 属性和 JSONAPI

    我有一个相当具体的问题 我希望你们中的一个真正聪明的人可能知道解决方案 甚至是现阶段的解决方法 具体来说 我正在处理操作电缆 嵌套 JSON 和 JSONAPI 我有一个asset模型 它具有一些属性 例如name desc等等 但它还有一
  • 覆盖 Kotlin 数据类的 getter

    给定以下 Kotlin 类 data class Test val value Int 我将如何覆盖Intgetter 以便如果值为负数则返回 0 如果这是不可能的 有哪些技术可以达到合适的结果 在花了几乎一整年的时间每天编写 Kotlin