Kotlin中的getter:get关键字的用途
如果我执行这个代码Kotlin中的getter:get关键字的用途,kotlin,Kotlin,如果我执行这个代码 fun main(args: Array<String>) { class Foo { val check: Boolean get() = 3 % 2 == 0 } val f = Foo() println(f.check) } 。。。然后它工作并返回false 当我离开的时候,出去 fun main(args: Array<String>) { class Foo { v
fun main(args: Array<String>) {
class Foo {
val check: Boolean get() = 3 % 2 == 0
}
val f = Foo()
println(f.check)
}
。。。然后它工作并返回false
当我离开的时候,出去
fun main(args: Array<String>) {
class Foo {
val check: Boolean = 3 % 2 == 0
}
val f = Foo()
println(f.check)
}
。。。那么结果是一样的
get关键字的实际用途是什么?在第一个代码中:
Getter是一个函数,字段并没有实际存储,它是一个伪字段,作为一个函数工作,结果在调用Getter时计算,即调用check时
使用这种类型的getter在计算运行时属性时非常有用,例如中提到的MutableList为空,因为它需要在每次调用时计算,因为它可以更改
福班{
val检查:布尔get=3%2==0
}
//相当于:
最后一节课Foo{
公共最终整数检查{
返回3%2==0;
}
}
在第二段代码中:
而在第二种情况下,字段在Foo类实例化时初始化,并存储在内存中。它已经成为一个运行时常量,将一直存在,直到对象没有被垃圾收集
福班{
val检查:布尔值=3%2==0
}
//相当于:
最后一节课Foo{
私有最终整数检查=3%2==0;
公共最终整数检查{
退货检查;
}
}
注意:除非在getter/setter中使用了字段初始值设定项或支持字段关键字,否则该属性实际上不是属性。在第一个代码中:
Getter是一个函数,字段并没有实际存储,它是一个伪字段,作为一个函数工作,结果在调用Getter时计算,即调用check时
使用这种类型的getter在计算运行时属性时非常有用,例如中提到的MutableList为空,因为它需要在每次调用时计算,因为它可以更改
福班{
val检查:布尔get=3%2==0
}
//相当于:
最后一节课Foo{
公共最终整数检查{
返回3%2==0;
}
}
在第二段代码中:
而在第二种情况下,字段在Foo类实例化时初始化,并存储在内存中。它已经成为一个运行时常量,将一直存在,直到对象没有被垃圾收集
福班{
val检查:布尔值=3%2==0
}
//相当于:
最后一节课Foo{
私有最终整数检查=3%2==0;
公共最终整数检查{
退货检查;
}
}
注意:除非在getter/setter中使用了字段初始值设定项或支持字段关键字,否则该属性实际上不是属性。示例优于单词
val a = 5
val b
get() = 10
反编译代码如下:
public final class MainKt {
private static final int a = 5;
public static final int getA() {
return a;
}
public static final int getB() {
return 10;
}
}
正如您所看到的,get并没有创建变量。这就是区别以身作则胜于言辞
val a = 5
val b
get() = 10
反编译代码如下:
public final class MainKt {
private static final int a = 5;
public static final int getA() {
return a;
}
public static final int getB() {
return 10;
}
}
正如您所看到的,get并没有创建变量。这就是区别嗨,我不认为反编译的代码在使用val时是静态的,我知道这是最终的。@AnisMARZOUK我在IDE中为此使用了特殊工具,对于jvm,它将生成静态字段,因为这些变量在任何类之外code@AnisMARZOUK类外定义的事物是静态的,类似于您在顶层定义main函数的方式。@Vlad,我现在看到您在文件而不是类中定义了val。因为在他的例子中,他使用了一个类,而在一个类中,val成为最终属性。嗨,我不认为反编译代码在使用val时是静态的,我知道它只是最终属性。@AnisMARZOUK我在IDE中使用了专用工具,对于jvm,它将生成静态字段,因为这些变量不属于jvm中的任何类code@AnisMARZOUK类外定义的东西是静态的,类似于您在顶级定义main函数的方式。@Vlad,现在我看到您在文件而不是类内定义了val。因为在他的例子中,他使用了一个类,而在一个类中,val变成了一个最终的属性。最后一行的挑剔:据我所知,Kotlin属性是一个显式或自动生成的getter方法;如果它是可变的,则与setter结合使用-即使它没有支持字段。@gidds这是什么意思?Kotlin属性是一个getter方法,即使它没有支持字段。我说过,如果它在getter/setter中的任何地方都没有使用field关键字,并且如果它没有像第二个代码那样直接初始化,那么它在jvm中就不会作为属性存在。Reference:@Aminesh该引用表示,如果需要,将生成支持字段。但这只是一个实现细节。正如该页所示,您可以拥有一个不带支持字段的属性,它的属性与具有支持字段的属性一样多。最后一行有一个挑剔之处:据我所知,Kotlin属性是一个显式或自动生成的getter方法;如果它是可变的,则与setter结合使用-即使它没有支持字段。@gidds这是什么意思?Kotlin属性是一个getter方法,即使它没有支持字段。我说如果它在gett中的任何地方都不使用field关键字
如果它没有像第二个代码那样直接初始化,那么它就不会作为属性存在于jvm中。Reference:@Aminesh该引用表示,如果需要,将生成支持字段。但这只是一个实现细节。正如该页所示,您可以拥有一个不带支持字段的属性,并且它的属性与具有支持字段的属性一样多。