Kotlin 重写默认构造函数中定义的变量的setter

Kotlin 重写默认构造函数中定义的变量的setter,kotlin,kotlin-interop,Kotlin,Kotlin Interop,我有一个Kotlin类,看起来像这样: class MyClass { var myString: String = "" set(value) { field = value doSomethingINeed() } constructor(myString: String) { this.myString = myString } } class MyClass(myS

我有一个Kotlin类,看起来像这样:

class MyClass {
    var myString: String = ""
        set(value) {
            field = value
            doSomethingINeed()
        }

    constructor(myString: String) {
        this.myString = myString
    }
}
class MyClass(myString: String) {
    var myString: String = myString
        set(value) {
            field = value
            doSomethingINeed()
        }
}
然而,Android Studio警告我,我可以将其用作默认构造函数。当我选择该选项时,它会将其更改为:

class MyClass(var myString: String)
现在我失去了重写setter的机会,因为如果我创建一个名为
setMyString()
的方法,我将得到一个编译器错误


如果字段是默认构造函数的一部分,是否有方法覆盖setter,或者我必须使用选项1,而忽略我得到的警告?

它的快速修复肯定会把事情搞砸,但注释试图为您指出正确的方向。您希望定义一个只接受参数(不定义属性)的主构造函数,然后将该参数用于属性初始化。大概是这样的:

class MyClass {
    var myString: String = ""
        set(value) {
            field = value
            doSomethingINeed()
        }

    constructor(myString: String) {
        this.myString = myString
    }
}
class MyClass(myString: String) {
    var myString: String = myString
        set(value) {
            field = value
            doSomethingINeed()
        }
}

请在Kotlin插件中将其报告为bug,但这是bug吗?似乎这只是我对该语言如何工作的误解@voddan任何想法或重构都应该在不改变其语义的情况下改变代码。在您的例子中,语义被破坏,因为它删除了自定义setter。“这就是为什么我认为这是一个错误。”沃丹谢谢你的推荐。我刚把票投进去——谢谢!这是我需要的解决方案,也是我已经实现的。有关文件转换错误的讨论和Kotlin票据的链接,请参见问题下方的评论。