@IntDef 注解和来自其他代码的无法注释化的返回值,或者如何暂时禁用注释以不影响代码?

11

我在我的代码中使用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;
}

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

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

这时候一切都很好,但问题出现在当我想要将其他方法的返回值传递给setLockMode()时,比如从Parcelable实现中:

private Foo(Parcel in) {
    ...
    setLockMode(in.getInt());
在这种情况下,我的IDE会抱怨我只能使用DEFAULT、NONE、VISIBLE、TRANSPARENTsetLockMode()。但是getInt()不是我的方法,因此我无法注释其返回值并使所有内容顺畅。我几乎确定这不是唯一的用例,但我找不到临时禁用AllowedValues注释在此处发出警告或者"转换"从getInt()返回值的方法来使AllowedValue不再报错的方法。
所以我的问题是:是否有解决此问题的方法?也许我在注释方面错过了一些明显的东西,但也许我应该创建错误报告,让谷歌解决这个问题?
感谢任何意见和想法。
2个回答

13

您可以通过在方法上添加以下注释来抑制IntDef Lint警告:

@SuppressLint("UniqueConstants")
@SuppressWarnings("ResourceType")

您也可以禁用单个语句和整个类的这些警告 - 有关更多文档,请参见Android工具网站


谢谢回答,+1。是的,我知道我可以忽略警告,但除非我没有其他选择,否则我不想这么做,所以基本上我想知道是否有其他解决我的问题的方法。 - Marcin Orlowski
我想你可以尝试扩展Parcel,在其中添加myGetInt方法。 - fractalwrench
刚刚检查了一下,扩展并不是一个好的方法,因为你仍然会看到投诉,因为注释使它期望“int”而不是方法。 - Marcin Orlowski

7
如果您只是在这个语句之前插入//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;
}

那么像 setLockMode(UiLockMode.lockModeTranslate(in.getInt())); 这样的调用将不再引起警告。


压制并不等同于说“这是一个正确的值”。它通常是一种说法,即“我无法真正检查它”或“我不关心它是否有效”(主要是因为“我无法真正检查它”:)。您的代码将关闭投诉,但这只是一种解决方法而不是解决方案。如果我有这个自动生成的东西(例如其他注释),那么也许可以,但否则压制更清晰。当然太糟糕了... - Marcin Orlowski
2
黑魔法:public @UiLockMode.AllowedValues static int lockModeTranslate(int val) { return val; } - hector6872
@hrules6872 但是如果您传递不支持的值呢? - Leo DroidCoder
喜欢这个解决方案,因为它抛出了SomethingHorribleException而不是意外的结果。 - Marcos Vasconcelos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接