kotlin getter 和 setter 期望成员声明错误?

Posted

技术标签:

【中文标题】kotlin getter 和 setter 期望成员声明错误?【英文标题】:kotlin getters and setters expecting member declaration error? 【发布时间】:2021-05-15 09:19:34 【问题描述】:

我开始学习 kotlin,但在实现 getter 和 setter 时遇到问题,我在网上搜索过,而且我的 getter 和 setter 的代码与许多指南使用的代码相同。

package com.test
import kotlin.Int

class Test

    var name: Int = 10;
    get()
        println("getting value");
        return field;
    
    set(value)
        println("setting value");
        field = value;   
    


fun main() 
    val test = Test();
    println(test.name);

我看不出这段代码有什么问题导致 kotlin 编译器发出错误。我正在使用kotlinc proj.kt 进行编译。

【问题讨论】:

【参考方案1】:

您似乎真的喜欢添加分号,并且您尝试将它们添加到任何地方。但是,在这种情况下,您添加的太早了:

var name: Int = 10;
get()
    println("getting value");
    return field;

set(value)
    println("setting value");
    field = value;

整件事声明了一个名为name的属性,所以var name: Int = 10后面不应该有分号。

您错误添加的分号使解析器认为name 的声明到此结束,因此解析器期望在此之后再进行另一个声明。你写了get() ...,而不是另一个声明,这只有在你声明一个属性时才对解析器有意义,但就解析器而言,此时你没有声明一个属性,就像@987654329的声明一样@ 已经被你的分号结束了。

如果必须添加分号,则应在set(value) 之后,如下所示:

var name: Int = 10
get()
    println("getting value");
    return field;

set(value)
    println("setting value");
    field = value;
;

有关属性声明,另请参阅grammar。

但是,请注意Kotlin coding convention says that you should omit semicolons whenever possible,因此您应该省略所有分号,如下所示:

var name: Int = 10
get()
    println("getting value")
    return field

set(value)
    println("setting value")
    field = value

【讨论】:

确实如此。 Kotlin 中很少需要分号;我想我只在将多个语句挤在一行上时使用过它们(这很少是一个好主意)。 @Sweeper 非常感谢,这让事情变得清晰了,现在我来自 C 和 python,我认为使用分号应该让事情更熟悉,并且不需要使用换行符来格式化代码。无论如何,对于未来,这是您能想到的关于此类分号错误的唯一陷阱还是还有更多? @Khaled Perhaps see this question?

以上是关于kotlin getter 和 setter 期望成员声明错误?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin类的初始化 ① ( 成员属性 | Kotlin 自动为成员字段生成 getter 和 setter 方法 | 手动设置成员的 getter 和 setter 方法 | 计算属性 )

对比Java学Kotlin数据类

对比Java学Kotlin数据类

对比Java学Kotlin数据类

Kotlin------类和对象

Kotlin的特性