Kotlin:乐趣与 val

2024-05-02

Kotlin 支持计算属性但我不确定何时使用它们。

假设我有一堂课:

class Car(val color: String)

并有这个返回的函数true如果汽车是白色的:

fun isWhite(car: Car): Boolean {
  return car.color == "WHITE"
}

现在我希望这个函数是成员函数 (a method);这看起来像这样:

class Car(val color: String) {
  fun isWhite(): Boolean = color == "WHITE"
}

但它也可以是这样的:

class Car(val color: String) {
  val isWhite: Boolean get() = color == "WHITE"
}

那么,哪一个更好呢?


官方Kotlin 编码约定 https://kotlinlang.org/docs/reference/coding-conventions.html#functions-vs-properties定义在节中功能和属性下列:

在某些情况下,不带参数的函数可以与只读属性互换。尽管语义相似,但在何时更喜欢其中一种方面存在一些风格约定。

当底层算法满足以下条件时,优先选择属性而不是函数:

  • 不抛出
  • 计算成本低廉(或在第一次运行时缓存)
  • 如果对象状态未更改,则在调用中返回相同的结果

所以,我会在上面的例子中使用val for isWhite,因为它不会抛出异常,所以字符串比较的计算成本很低,并且color of the Car无法改变,因为Car.color本身定义为val.

编译差异

请注意,JVM 字节码get()块将被编译为与函数完全相同的代码。因此,对于编译的字节码,这两种方法是相同的没有性能差异 https://itsronald.com/blog/2016/06/kotlin-get-property-vs-method.

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

Kotlin:乐趣与 val 的相关文章

  • @Service 中带有 Kotlin 的 Spring Boot @Autowired 始终为 null

    目前 我尝试使用 Kotlin 重写我的 Java Spring Boot 应用程序 我遇到了一个问题 在我所有的类中都用 Service依赖注入无法正常工作 所有实例都null 这是一个例子 Service Transactional o
  • Ktor 如何处理空响应

    我使用 Ktor 和这样的线路myentity client get url 从 API 响应获取并反序列化我的实体 当 API 返回某些内容时它工作正常 但是一旦 API 没有任何可返回的内容并发送 HTTP 204 响应 它就会失败并显
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter
  • C# WPF 如何动态设置属性设置方法?

    我一直在四处寻找 但似乎找不到我要找的东西 所以我会在这里尝试一下 情况 我有 MainWindow 和 MainWindowData 类 MainWindowData 中只有使用 UpdateGUI 属性定义的公共属性 public cl
  • 如何在 Java 9 中使用新的 BeanInfo 注解

    JEP 256 BeanInfo 注释 http openjdk java net jeps 256为JavaBean http download java net java jdk9 docs api java beans JavaBea
  • 当目标是属性时,@Throws 不起作用

    在看的同时这个问题 https stackoverflow com q 47737288 7366707 我注意到申请 Throws to a get or setuse site 没有影响 此外 唯一有效的目标 for Throws ar
  • 何时使用属性而不是函数

    这可能是个人喜好的问题 但是什么时候在代码中使用属性而不是函数 例如 要获取错误日志 我可以说 string GetErrorLog return m ErrorLog 或者我可以 string ErrorLog get return m
  • Spring中从ResourceBundleMessageSource按模式获取属性键

    我有近百个这样的房产 NotEmpty order languageFrom Field Language can t be empty NotEmpty order languageTo Field Language can t be e
  • 读取文件并获取 key=value 而不使用 java.util.Properties

    我正在构建一个 RMI 游戏 客户端将加载一个包含一些键和值的文件 这些键和值将用于多个不同的对象 它是一个保存游戏文件 但我不能为此使用 java util Properties 它符合规范 我必须读取整个文件并忽略注释行和与某些类不相关
  • 为什么线程比协程表现出更好的性能?

    我编写了 3 个简单的程序来测试协程相对于线程的性能优势 每个程序都会执行许多常见的简单计算 所有程序都彼此分开运行 除了执行时间之外 我还通过以下方式测量了 CPU 使用率Visual VMIDE 插件 第一个程序使用以下方法进行所有计算
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • Jetpack 中的波浪框组成

    有没有办法用Canvas制作一个顶部有波浪形的盒子 我想知道这个效果是否可以直接用Canvas来实现 不需要有滚动动画 不太清楚你为什么在谈论Canvas 要裁剪这样的视图 您可以使用自定义Shape并将其应用到您的视图中Modifier
  • 在viewpager2中禁用动画

    我有 viewpager2 和扩展 FragmentStateAdapter 的适配器 我希望用户仅通过单击选项卡布局即可转到另一个页面 我已禁用此 viewpager2 的用户输入 但是当我单击选项卡时 有页面之间快速滑动的动画 但我只想
  • 来自java的kotlin函数默认参数

    给出以下 Kotlin 类 class Foo public fun bar i Int 0 Int 2 i 我应该如何在没有 java groovy 代码中的任何参数的情况下调用 bar 函数 def f new Foo f bar th
  • 如何使 FirebaseAuth.AuthStateListener 在 Kotlin 中工作?

    class LoginActivity AppCompatActivity private val firebaseAuth FirebaseAuth getInstance private val firebaseAuthListener
  • 如何在 IntelliJ Kotlin 项目中使用条件断点动态调试变量时更改值?

    在 Java 项目中 通过 mis 调试时可以实现这一点 使用条件断点为属性或变量设置值 Java断点 https i stack imgur com I4JL2 png 不幸的是 同样的事情在 Kotlin 项目中是不可能的 错误是 赋值
  • 将父控件的属性传递给子控件

    我正在为特定应用程序开发一组自定义控件 我想定义对于外观目的的控件集通用的属性 为了论证 让我们这样做CustomCtrl AccentColor 我想为我的 Windows 窗体定义相同的属性 即Form1 AccentColor当我更改
  • 与 Dagger 一起使用时,Espresso 生成 FileNotFoundException

    我一直在研究旧版 Android 应用程序 尝试为其添加测试和适当的架构 该应用程序有一个主要LaunchActivity它在启动时运行一系列检查 最初 该活动使用 Dagger 来 注入依赖项 活动将使用它来运行检查 但效果相当糟糕 我转
  • 如何使用 javascript 更改文件扩展名

    有谁知道在 Javascript 中更改文件扩展名的简单方法吗 例如 我有一个带有 first docx 的变量 但我需要将其更改为 first html 这将改变字符串包含文件名 let file first docx file file
  • 如何在 Spring 属性中进行算术运算?

随机推荐

  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • Kivy:滚动缩放

    有没有办法在桌面 kivy 应用程序上放大图像 例如使用鼠标滚轮缩放 这里似乎讨论过 https github com kivy kivy issues 3563 https github com kivy kivy issues 3563
  • 在 10 亿次迭代中获得相同 GUID 的机会有多大?

    我正在开展一个项目 需要生成大约 10 亿个 GUID 我知道 GUID 不能保证是唯一的 但几乎始终是唯一的 如果我生成了十亿个 GUID 那么匹配的概率是多少 博客文章 GUID 是全局唯一的 但 GUID 的子字符串不是 https
  • 如何使用Django模板作为组件?

    我有 5 个模板 index html detail html tag html login html register html and a 基本 html 所有 5 个模板都会扩展基本 html 索引 html 详细信息 html 标签
  • 为什么地址清理器对 bss 全局溢出不起作用?

    我做了什么 Test1 1 include
  • EJB3 - 通过注入与查找获取 bean - 有什么区别、影响和陷阱?

    我知道有两种获取 EJB 实例的方法 通过 EJB 注释在 servlet 和 EJB 中进行依赖注入 在任何地方通过 Context lookup 进行 JNDI 查找 使用这两种方法有哪些差异 影响和陷阱 它们是一样的吗 依赖注入比查找
  • 永远不要关闭 Android SQLite 连接

    如果您根本不关闭连接会发生什么 我知道如果您不关闭它并尝试打开另一个单例 您会遇到异常 但是如果您有一个全局单例 并且您只是不关闭它 会发生什么情况 任何想法 时空连续体中形成了裂痕 威胁着宇宙中所有生命的灭绝 直到一群穿着鲜艳滑稽服装的人
  • 数据表:根据值更改单元格颜色

    我正在使用 DataTable 创建交互式表 我有 9 列 其中 5 列是值 我想根据每个单元格的具体情况更改其背景颜色 我开始尝试首先更改整个行的颜色 因为这似乎是一个更容易的任务 但我无法改变任何事情 我的代码如下
  • 为什么 ReadOnlySpan 不能用作泛型委托和泛型方法的类型参数?

    我明白为什么ReadOnlySpan不能用作泛型类的类型参数 ReadOnlySpan仅是堆栈 因此它不能用作字段类型 字段成员像其容器对象一样存在于堆中 但是返回值和参数始终只是堆栈 所以为什么ReadOnlySpan不能用作泛型委托和泛
  • 未处理的异常:SocketException:主机查找失败:(操作系统错误:没有与主机名关联的地址,errno = 7)

    我们已经在 Playstore 中发布了一个发行版本 并且运行得很好 但现在突然间 当我们尝试再次构建并运行代码时 因为我们想要添加新功能 它将不再与我们的后端通信 所以我使用错误作为关键字在网络上进行搜索 发现需要 INTERNET PE
  • 使用“adb devices”命令无法找到 Android 设备

    我正在开发Android申请于macOS我的应用程序在模拟器上运行良好 我想在设备上运行它 但是当我运行时adb devices我什么也没得到 localhost platform tools BF adb devices List of
  • 在react-native中将本地图像uri作为props传递

    我正在尝试将图像的 uri 作为 prop 传递 以便我可以在 React Native 上多次重复使用它 但是 当前的解决方案提示我 require 应该使用字符串文字 const ImageButton source gt
  • Twitter APi“代码”:215,“消息”:“错误的身份验证数据

    接收错误 code 215 message 错误的身份验证数据 in my page var dump page 我读到 Friends exist 不再适用于 1 1 版本 因此我需要使用 Friends lookup 来比较一个 Twi
  • Azure Pipelines 状态徽章未显示在 Markdown 中

    我已经为我的 github 存储库之一设置了 azure 管道 除了构建状态徽章之外 一切都工作正常 它没有正确显示 似乎无法加载图像 目前正在显示 Edit markdown 文件中使用的代码由 azure devops 自动生成 Bui
  • Oracle BLOB 与 VARCHAR

    我需要在表的一列中存储一个 大 SQL 查询 我想使用BLOB场地 需要明确的是 我想存储查询 而不是其结果 最好使用什么 BLOB or a VARCHAR 或者也许还有别的什么 另一种选择是 CLOB 对于文本数据 使用 CLOB 比使
  • git 存储库中的提交次数

    我的一个为期 5 个月的项目即将结束 作为毫无意义的统计数据的粉丝 我想知道自存储库启动以来已经进行了多少次提交 我怎样才能发现这一点 Notes 我知道没有one存储库 我只对本地版本感兴趣 这在颠覆中是微不足道的 因为修订标识符 似乎是
  • 回发后我的 JavaScript 函数在 ASP.NET 中不起作用

    我有共同的功能 我把它折叠起来CommonFunctions js在脚本文件夹中 我将它包含在我的主页上并在我的页面上使用它 当我在页面上进行任何回发时 我的功能不起作用 My CommonFunctions js function gf
  • 使用 List.Sort(Comparison Comparison 在 C# 中对列表进行排序

    我创建了一个类 如下所示 public class StringMatch public int line num public int num of words 我创建了一个列表 List
  • 共享 Google 地图或拍摄 Android 手机屏幕截图

    我正在使用 android google map api v2 开发 android 应用程序 到目前为止我已经取得了以下成绩 打开谷歌地图显示用户的位置 当他行走时 他可以在地图上添加标记 标记他经过的地方 他可以删除标记或拖动它们 我现
  • Kotlin:乐趣与 val

    Kotlin 支持计算属性但我不确定何时使用它们 假设我有一堂课 class Car val color String 并有这个返回的函数true如果汽车是白色的 fun isWhite car Car Boolean return car