【问题标题】:How to apply @IntRange() support annotation to Kotlin property setter如何将 @IntRange() 支持注释应用于 Kotlin 属性设置器
【发布时间】:2018-10-11 11:06:43
【问题描述】:

我一直在尝试了解如何将 @IntRange(from = 1) 应用于我的 Kotlin 属性。经过几次失败的尝试,我终于在 Java 中创建了我想要的类,并将其转换为 Android Studio 中的 Kotlin。这是我的 Java 类:

import android.support.annotation.IntRange;

public class SimpleThing {

    private int val;

    @IntRange(from = 1)
    public int getVal() {
        return val;
    }

    public void setVal(@IntRange(from = 1) int val) {
        this.val = val;
    }

}

这是我从 Android Studio 得到的自动转换:

import android.support.annotation.IntRange

class SimpleThing {

    @get:IntRange(from = 1)
    var `val`: Int = 0

}

@IntRange 似乎适用于 getter,但不适用于 setter。是否可以将此注释应用于设置器,以便出现适当的 lint 警告。目前我刚刚重写了 set 方法来抛出这样的 IllegalArgumentException:

@get:IntRange(from = 1)
var rowSize: Int = 3
    set(value) {
        if (value < 1) throw IllegalArgumentException("row size must be at least 1")
        field = value
        notifyDataSetChanged()
    }

我已经尝试添加@set:IntRange(from = 1),但我收到错误This annotation does not apply for type void,因为它试图将@IntRange 应用于返回值(在setter 的情况下是无效的)而不是setter 参数。

【问题讨论】:

    标签: android kotlin android-annotations android-lint kotlin-interop


    【解决方案1】:

    @setparam 注释似乎是我正在寻找的,但当我尝试分配超出范围的值时,Android Studio 中没有发出 lint 警告。

    这是我的新代码:

    @get:IntRange(from = 1)
    @setparam:IntRange(from = 1)
    var rowSize: Int = 3
        set(value) {
            if (value < 1) throw IllegalArgumentException("row size must be at least 1")
            field = value
            notifyDataSetChanged()
        }
    

    这是我通常希望看到一个 lint 警告的地方,告诉我我正在分配一个 int 范围之外的值

    但是,在 Kotlin 代码中使用 SimpleThing 类时确实会出现 lint 警告

    将 Kotlin 方法作为 Java 代码调用时也不会出现 lint 警告

    这个功能似乎还没有实现。

    【讨论】:

    • 是的,同样的事情。 kotlin 中的 linter 不强制执行 Androidx 注释
    【解决方案2】:

    目前无法对此进行测试,但您是否尝试过像这样添加@set:

    @set:IntRange(from = 1)
    @get:IntRange(from = 1)
        var `val`: Int = 0
    

    【讨论】:

    • 是的,已经尝试过了。我收到一条错误消息,上面写着This annotation does not apply for type void。我认为问题必须有某种方式来指定注释在方法参数上而不是返回类型上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 2019-04-02
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多