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

时间:2015-07-30 20:54:01

标签: java android annotations android-support-library android-lint

我在我的代码中使用IntDef中的Android Support annotation(但我的问题范围更广,所以请继续阅读:)就像这样:

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;
}

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

protected void setLockMode(@UiLockMode.AllowedValues int lockMode) {
    ...

此时一切都很好,但只要我想将其他方法的返回值传递给setLockMode(),就会出现问题,例如来自Parcelable实现:

private Foo(Parcel in) {
    ...
    setLockMode(in.getInt());

在这种情况下,我的IDE抱怨我只允许DEFAULT, NONE, VISIBLE, TRANSPARENT使用setLockMode()。但是getInt()不是我的方法所以我不能注释它的返回值并让所有这些都快乐。我也几乎可以肯定这不是唯一的用例,但是我没有找到暂时禁用AllowedValues注释的方法来抱怨这里或者#3​​4; cast"从getInt()返回值,使AllowedValue不抱怨。

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

任何意见或想法。

2 个答案:

答案 0 :(得分:14)

您可以通过以下方式对方法进行注释来取消IntDef Lint警告:

@SuppressWarnings("ResourceType")

您还可以为单个语句和整个类禁用这些警告 - 有关详细说明,请参阅Android Tools site

答案 1 :(得分:5)

如果您只是通过在其上方插入//noinspection ResourceType来取消对此单个语句的警告,那么这是否等同于“让它理解getInt()此时返回的值是否正确”?< / p>

或者,您可以向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;
}

然后像setLockMode(UiLockMode.lockModeTranslate(in.getInt()));之类的通话将不会再发出警告。