@IntDef注释并返回其他代码中无法注释的值或如何暂时禁止注释影响代码?

Mar*_*ski 10 java android annotations android-lint android-support-library

我在我的代码中使用来自Android支持注释的IntDef(但我的问题范围更广,所以请继续阅读:)像这样:

public class UiLockMode
{
    @IntDef({DEFAULT, NONE, VISIBLE, TRANSPARENT})
    @Retention(RetentionPolicy.SOURCE)
    public @interface AllowedValues {}

    public static final int DEFAULT     = 0;
    public static final int NONE        = 1;
    public static final int VISIBLE     = 2;
    public static final int TRANSPARENT = 3;
}
Run Code Online (Sandbox Code Playgroud)

接下来,我得到了一些其他注释方法,如下所示:

protected void setLockMode(@UiLockMode.AllowedValues int lockMode) {
    ...
Run Code Online (Sandbox Code Playgroud)

那时候一切都很好,但是每当我想从其他方法传递返回值时问题就出现了setLockMode(),比如来自Parcelable实现:

private Foo(Parcel in) {
    ...
    setLockMode(in.getInt());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我的IDE抱怨,我只允许使用DEFAULT, NONE, VISIBLE, TRANSPARENTsetLockMode().但这getInt()不是我的方法所以我不能注释它的返回值并让所有这些都快乐.我也几乎可以肯定这不是唯一的用例,但我没有找到暂时禁用AllowedValues注释的方法,或者"抛出"返回值getInt()以使其AllowedValue不抱怨.

所以我的问题是:有什么方法可以解决这个问题吗?也许我错过了一些关于注释的明显内容但也许我会创建错误报告以使Google解决此问题?

任何输入或思想赞赏.

fra*_*nch 14

您可以IntDef通过使用以下方法对方法进行注释来抑制方法的Lint警告:

@SuppressWarnings("ResourceType")
Run Code Online (Sandbox Code Playgroud)

您还可以为单个语句和整个类禁用这些警告 - 有关更多文档,请参阅Android工具站点.


Mil*_*myk 5

如果你只是通过插入//noinspection ResourceType它来抑制这个单一语句的警告,这不等于"让它理解此时返回的值getInt()是正确的"吗?

或者,您可以向UiLockMode添加一个从int转换为@UiLockMode的简单方法,例如:

public @UiLockMode.AllowedValues static int lockModeTranslate(int val)
{
    switch(val)
    {
        case 0: return UiLockMode.DEFAULT;
        case 1: return UiLockMode.NONE;
        case 2: return UiLockMode.TRANSPARENT;
        case 3: return UiLockMode.VISIBLE;
    }

    throw new SomethingHorrible;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样的电话setLockMode(UiLockMode.lockModeTranslate(in.getInt()));将不再发出警告.

  • 黑魔法:public @ UiLockMode.AllowedValues static int lockModeTranslate(int val){return val; } (2认同)