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该引用表示,如果需要,将生成支持字段。但这只是一个实现细节。正如该页所示,您可以拥有一个不带支持字段的属性,并且它的属性与具有支持字段的属性一样多。