Java @IntDef注释和其他';s无法注释的代码,或者如何临时禁用注释以避免影响代码?
我在代码中使用from(但我的问题范围更广,所以请继续阅读:)如下:Java @IntDef注释和其他';s无法注释的代码,或者如何临时禁用注释以避免影响代码?,java,android,annotations,android-support-library,android-lint,Java,Android,Annotations,Android Support Library,Android Lint,我在代码中使用from(但我的问题范围更广,所以请继续阅读:)如下: public class UiLockMode { @IntDef({DEFAULT, NONE, VISIBLE, TRANSPARENT}) @Retention(RetentionPolicy.SOURCE) public @interface AllowedValues {} public static final int DEFAULT = 0; public sta
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) {
...
接下来,我用它注释了一些其他方法,如下所示:
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()
不是我的方法,所以我不能注释它的返回值并让所有这些都满意。我也几乎可以肯定这不是唯一的用例,但我没有找到方法暂时禁用AllowedValue
注释以避免在此处抱怨,或者从getInt()
中“强制”返回值以确保AllowedValue
不抱怨
所以我的问题是:有没有办法解决这个问题?也许我遗漏了一些明显的注释,但也许我应该创建bug报告,让谷歌解决这个问题
任何输入或想法都值得赞赏。您可以通过以下注释来抑制方法的
IntDef
Lint警告:
@SuppressWarnings("ResourceType")
您还可以对单个语句和整个类禁用这些警告—有关更多文档,请参阅。如果您仅通过在单个语句上方插入
//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())代码>将不再引起警告。谢谢您的回答,+1。是的,我知道我可以抑制警告,但我不想,除非我没有其他选择,因此,基本上我想知道是否有其他方法可以解决我的问题。我想你可以尝试扩展Parcel,在其中添加myGetInt方法。只是检查和扩展不是一种方法,因为你仍然会看到抱怨,因为注释使它期望
int
不是一种方法。好吧,抑制不是一种等价的说法“这是一个正确的值”。这通常是一种表示“我真的不能检查它”或“我不在乎它是否有效”的方式(主要是因为“我真的不能检查它”)。您的代码将关闭投诉,但这是一种解决方法,而不是一种解决方案。如果我想自动生成此内容(使用其他注释)那也许没问题,但其他方面抑制就更清楚了。当然,太糟糕了……黑魔法:public@UiLockMode.AllowedValues static int lockModeTranslate(int val){return val;}@hrules6872但是如果你传递了不支持的值呢?喜欢这个解决方案,因为它会抛出一些可怕的异常,而不是未执行的结果