kotlin - 如何使用进行错误检查的自定义 setter 初始化属性?

标签 kotlin

如何使用自定义 setter 初始化属性?

例如,在我的 setter 中,我确保该值不是负数。

class Foo(length: Int) {
    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }
}

但是,如果我将其称为 Foo(-5),则不会调用异常,因为在初始化属性时不会调用 setter。

我尝试的另一件事是在下面,但是将长度设置两次似乎是错误的。

class Foo(length: Int) {
    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }

    init {
        this.length = length
    }
}

最后我想到了下面的代码,但这似乎是错误的,因为您在两个地方检查了错误的值。

class Foo(length: Int) {
    init {
        if (length < 0) throw IllegalArgumentException("Can't be negative.")
    }

    var length = length
        set(value) {
            if (value < 0) throw IllegalArgumentException("Can't be negative.")
            field = value
        }
    }
}

最佳答案

您的第二个方法已经尽可能干净了,尽管我会将初始值设置为某个常量,例如 0 而不是 length。然后,如果您忘记在 init block 中分配 length,您会收到编译器警告,指出构造函数参数未使用。

关于kotlin - 如何使用进行错误检查的自定义 setter 初始化属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60515389/

相关文章:

java - Spring 启动 : Change property placeholder signifier

kotlin 中的 Spring 注入(inject)通用接口(interface)实现列表

java - 以编程方式禁用 Android 上的屏幕开/关磁传感器

android - 在 Jetpack Compose 中绘制像素艺术

android - 如何使向上按钮返回而不是打开抽屉导航

java - 如何使这个复杂的 if-else 语句在 Kotlin 中可维护

java - 如何在不运行其他安装程序的情况下升级 jpackage 应用程序?

android - Dagger:如何提供参数化基类型的具体实现?

android - 如何修复 "' dexOptions(Action<DexOptions>) : Unit' is deprecated. 设置 dexOptions 已过时。”?

android - 系统范围的屏幕覆盖: a draggable UI element made in Compose?