Oop kotlin中显式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函数选择属性时,您需要问自己很多问题:Oop kotlin中显式getter的目的是什么?,oop,kotlin,getter,Oop,Kotlin,Getter,在面向对象语言中,使用getter和setter是一种众所周知的做法。这样做是为了更好地控制变量。为了实现这一点,我们在java中使变量私有,因此我们需要getter和setter 但在科特林,情况并非如此。在这里,甚至公共变量也默认通过getter和setter进行访问。尽管可以使用setter来验证对变量的赋值,但getter只返回存储的变量(我认为这就是他们的任务)。因此,根本不需要自定义getter 我还看到了这个特性的一些错误用法,它们没有编写零参数函数,而是使用val并在getter
- 它描述了行为吗?使用函数(
,walk()
等)build()
- 它描述的是国家吗?使用属性(
,firstName
等)lastIndex
是一个函数,如果deque为空,它将抛出ArrayDeque.first()
是一个属性,计算起来很便宜List.lastIndex
是一个属性,在第一次访问时计算并缓存该值Lazy.value
- 只是一些更多的信息。除了可读性之外,定义自定义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
相同的值(忽略并发性)。但是您不会将类似于随机
或增量
的内容设置为属性,因为拥有更改状态的属性是不直观的。