Oop kotlin中显式getter的目的是什么?

Oop kotlin中显式getter的目的是什么?,oop,kotlin,getter,Oop,Kotlin,Getter,在面向对象语言中,使用getter和setter是一种众所周知的做法。这样做是为了更好地控制变量。为了实现这一点,我们在java中使变量私有,因此我们需要getter和setter 但在科特林,情况并非如此。在这里,甚至公共变量也默认通过getter和setter进行访问。尽管可以使用setter来验证对变量的赋值,但getter只返回存储的变量(我认为这就是他们的任务)。因此,根本不需要自定义getter 我还看到了这个特性的一些错误用法,它们没有编写零参数函数,而是使用val并在getter

在面向对象语言中,使用getter和setter是一种众所周知的做法。这样做是为了更好地控制变量。为了实现这一点,我们在java中使变量私有,因此我们需要getter和setter

但在科特林,情况并非如此。在这里,甚至公共变量也默认通过getter和setter进行访问。尽管可以使用setter来验证对变量的赋值,但getter只返回存储的变量(我认为这就是他们的任务)。因此,根本不需要自定义getter

我还看到了这个特性的一些错误用法,它们没有编写零参数函数,而是使用val并在getter中进行计算。这造成了一种错觉,即该对象只是一个val,但实际上它不存储任何内容,而是每次执行一次计算

那么,真的需要定制getter吗

getter只返回存储时的变量(我想这就是他们要的)。因此,根本不需要自定义getter

如果真是这样,为什么Java中有getter呢?封装的目标之一是确保类中的更改不会更改其API。科特林也是这样

我还看到了这个特性的一些错误用法,它们没有编写零参数函数,而是使用val并在getter中进行计算。这造成了一种错觉,即该对象只是一个val,但实际上它不存储任何内容,而是每次执行一次计算

这是一个完全有效的自定义getter用例。在Kotlin中,不能假设使用属性完全没有开销。在使用getter或zero arg函数选择属性时,您需要问自己很多问题:

  • 它描述了行为吗?使用函数(
    walk()
    build()
    等)
  • 它描述的是国家吗?使用属性(
    firstName
    lastIndex
    等)
此外,属性getter不应该抛出异常,或者计算成本低,或者在第一次访问时缓存,并且应该为多个连续执行返回相同的结果。以下是标准库中的示例:

  • ArrayDeque.first()
    是一个函数,如果deque为空,它将抛出
  • List.lastIndex
    是一个属性,计算起来很便宜
  • Lazy.value
    是一个属性,在第一次访问时计算并缓存该值
大多数委托属性都使用自定义getter

更多阅读:


    • 只是一些更多的信息。除了可读性之外,定义自定义getter的可能性允许您在不更改其公共成员的情况下演化类,即使您从没有自定义getter的简单
      val
      开始

      在没有属性的语言(如Java)中,如果定义公共字段:

      公共类Foo{
      公共最终整数值;
      公共Foo(int值){
      这个值=值;
      }
      }
      
      然后,你想修改这个类来添加一个特性,在这个特性中,如果你翻转一个布尔值,那么如果不破坏使用这个类原始版本的代码,就无法实现。因此,您应该首先使用getter和setter

      但在Kotlin中,您不能直接公开这样的支持字段,因此不可能像使用Java中的公共字段那样将自己画在角落里。如果您的原始类是这样的:

      类Foo(val值:Int)
      
      您可以这样修改它以添加该特性,并且对已经使用该类的代码没有影响

      class Foo(private val originalValue:Int){
      var isNegated=false
      val值:Int
      get()=if(isNegated)-originalValue-else originalValue
      }
      
      谢谢,这正是我所希望的。每当我在谷歌上搜索访问者时,他们总是倾向于关注二传手,而很少关注获得者<代码>为什么Java中有getter?在Java中,要有setter,您需要一个getter(因为变量必须是私有的)。但科特林的情况并非如此。所以我问。另外,对不起,我不知道如何在评论中引用。因此,我必须使用代码样式。您不能在注释中引用,所以这很好。没有规则,getter应该始终返回相同的值。若属性是只读的,并不意味着它不能以某种方式更改。常见的例子是可变集合上的
      size
      属性。@K.H.当然它可以更改,我没有说属性必须是常量。我的意思是,如果您连续调用属性10次,而没有任何其他更改,那么可以合理地期望它返回与
      size
      相同的值(忽略并发性)。但是您不会将类似于
      随机
      增量
      的内容设置为属性,因为拥有更改状态的属性是不直观的。