当前位置: 首页 > 知识库问答 >
问题:

在Kotlin中声明数据类中字段的更好方法是什么?

常俊爽
2023-03-14
data class Money(private var _amount: Int, private val currency: String) {
    private var amount: Int = _amount
        get() {
            return if (field < 0) 0 else field
        }

    override fun toString(): String {
        return "Money(amount=$amount, currency='$currency')"
    }

}

我想知道我应该传递什么作为参数:var还是val?我应该添加私人修改吗?在哪种情况下是最佳实践?因为当我添加getter时,我必须将其改为var,但正如我所知,用Kotlin写val总是更好?

共有1个答案

楚岳
2023-03-14

我想这样编写您给出的代码:

data class Money(private var _amount: Int, private val currency: String) {
    private var amount: Int
        get() = _amount.coerceAtLeast(0)
        set (value) { _amount = value }

    override fun toString() = "Money(amount=$amount, currency='$currency')"
}
  • _amount可以是一个参数,它不应该是一个字段,它将在构造之后消失,并且只能在init块、构造函数和字段变量初始化器中访问(想象一下Java中的构造函数参数)。
  • 强制至少是stdlib
  • 中一个有用的实用程序扩展 只有一个返回语句的
  • 方法可以写成一个线性
  • 数据类应该是纯数据类,我认为不应该声明带有支持字段的属性。
    • 相反,使用私有属性作为支持字段,并通过getter和setter改变支持字段,它们实际上是对私有字段的包装。

    一个不太重要的事情是,可以推断amount的类型,但我想在这里显式声明它,因为它对新来的人来说更友好。

 类似资料:
  • 我是 Kotlin 的新手,我有以下疑问 - 使用Java到Kotlin转换器(此链接),我将以下Java代码转换为Kotlin。 Java类: 生成的Kotlin类: 但是我不明白Java代码和生成的静态编程语言代码是如何等价的,因为类数据成员的可见性修饰符从私有(Java)变为公共(静态编程语言)。 我相信,如果可见性修饰符被保留(数据成员在静态编程语言中被声明为私有),getter和sett

  • 问题内容: 我正在尝试首次使用Kotlin构建android应用程序。 我想在OnCreate方法外的某些按钮上声明,并且只能在带有findViewById的此函数内对其进行初始化。 我可以像Java中那样用简单干净的代码声明吗? 因为当将其转换为Kotlin时,它看起来像: 然后在初始化OnClick函数时需要添加!标志: 什么是正确和最清洁的方法? 问题答案: 这是一个很好的用例。标记属性可以

  • 因为在protobuf中,在某些场景中定义一个灵活的结构很麻烦。 例如: 事实上,我不希望服务的客户端同时传递a和other。然而,在protobuf中,我们不能将这两个字段放在其中一个,因为另一个是列表字段。因此,声明了上述消息后,当我们只传递a\u other字段时,客户端无法判断a字段实际上是0还是服务器没有传递。 所以我想知道是否为定义一个字符串字段,例如: 并且服务器端和客户端都同意将字

  • 问题内容: 我是SQLAlchemy新手。 假设我在声明模式下有一个用户表: 当我知道没有将对象加载到会话中的用户ID时,我会像这样更新该用户: 我不喜欢使用,我应该不再为此担心吗? 有一个更好的方法吗? 谢谢! 问题答案: 在ORM级别上也有一些更新功能。它还不能处理任何棘手的情况,但是对于单行更新(或批量更新)的普通情况,它可以正常工作。它甚至会遍历所有已加载的对象,并将更新应用于它们。您可以

  • 假设我想为整数列表声明一个简单的代数数据类型: 但是,最后一个声明导致一个错误 数据类必须至少有一个主构造函数参数 > 为什么存在这种限制?查看文档,似乎没有很好的技术理由要求数据类构造函数为非空 不需要编写大量样板代码就可以表达空构造函数吗?如果我把最后的声明改成 然后我就失去了和的免费实现,它们是通过声明免费提供的。 编辑 亚历克斯·费拉托夫在下面给出了一个简短的解决方案。显然,您永远不需要超

  • 问题内容: Java中方法声明的语法如下所示: Java方法声明BNF: 我想知道方括号是什么意思。 谁能给我一个例子吗? Java中的方法声明是否如上(泛型如何)? 在哪里可以找到Java的完整和实际的BNF语法? 问题答案: 方括号表示方法返回数组。例如,您可以编写一个返回int数组的方法,如下所示: 但是,许多人不熟悉此语法,最好避免使用。 您可以在此处找到Java 7的完整语法:http