gpt4 book ai didi

kotlin - 为什么 Kotlin 隐式调用属性的 getter 和 setter?

转载 作者:行者123 更新时间:2023-12-02 13:07:00 25 4
gpt4 key购买 nike

当您尝试访问属性时,Kotlin 隐式调用 getter/setter 函数的目的是什么?如果您打算使用 getter 和 setter,您是否可以轻松调用它们? Kotlin 的版本基本上只是通过“字段”标识符引入了额外的复杂性,并引入了如下奇怪的东西,其中对象的行为可能与其预期的接口(interface)不同:

interface Counter {
var count: Int
fun increment() {
count = count + 1
}
}

class WeirdCounter: Counter {
override var count: Int = 0
get() = field
set(value) {println("ignore the value")}
}
只是想了解这背后的意图。

最佳答案

Kotlin 使用 getter 和 setter 实现属性的方式基本上是许多其他语言的常见做法和最佳做法。
与 Java 一样,“裸”字段简单、清晰且易于使用;但是 裸田有问题 :

  • 它们暴露了一个实现细节(字段,尤其是它的类型),防止它在 future 被改变。
  • 他们不允许类控制自己的状态。

  • 当然,这些对于简单的值类来说不是问题。但是对于更复杂的类,它们可能是一个真正的问题。
    例如,您可能想要更改类存储其状态的方式(例如,将 long 替换为 BigDecimal ),但如果该类是流行库的公共(public)接口(interface)的一部分,那么成千上万的用户会非常恼火。
    或者假设如果您可以确保 String 属性始终以小写形式存储而没有前导或尾随空格,那将非常方便。但是对于“裸”属性,没有办法强制执行。
    所以通常的模式是有一个字段 这是私有(private)的,只能从类本身(由您控制​​)中访问; 并提供访问器方法 .
    这使您可以完全控制。您可以更改内部表示,只要您根据需要更新访问器方法以转换为新表单/从新表单转换。您的 setter 可以进行任何规范化、格式化或任何其他操作以对状态实现任何限制。
    然而,在像 Java 这样的语言中,这更加尴尬和冗长 比一个简单的字段:访问器方法将一个单行字段变成七行(不包括空白行,不包括文档注释,所以这可能更像是把 3 行变成 21 行)。虽然调用 getter 方法只比引用字段长几个字符( get() ),但调用 setter 远不如简单的赋值直观。
    结果是要么开发人员做正确的事并用样板填充他们的类(对可维护性和错误风险的所有影响),要么他们不打扰并冒上述问题的风险。
    然而,Kotlin 提供了两全其美的效果 : 一个简单的属性看起来就像一个字段,无论是在定义还是访问它时。所以你得到了精简、简洁、清晰的代码。但它是通过私有(private)支持字段(如果需要)和访问器方法实现的,因此您也可以获得这些优势。如果您需要添加验证或更改表示或记录所有访问或其他任何内容,您可以选择用您自己的实现替换默认访问器。
    您的 WeirdCounter这个例子很奇怪,但并不像你想象的那么可怕(或可能)。在面向对象的语言中,一个类是自己状态的主人,而其他类通常不知道也不应该知道它的内部。 (这样,它们就不会对这些内部结构进行更改。)如果一个类需要在 setter 中做一些违反直觉的事情,那么只有在它违反了类的契约时才需要担心——但这将是一个错误,应该成为在测试中很明显,如果不是在其他地方。
    在实践中,类控制对其状态的访问的能力比一个类使用它来做一些愚蠢或恶意的事情(这很容易被发现)的风险更重要。

    关于kotlin - 为什么 Kotlin 隐式调用属性的 getter 和 setter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62524680/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com