@IntDef 注释和来自其他代码的return 值无法注释或如何暂时禁用注释影响代码?
@IntDef annotation and return value from other's code that cannot be annotated or how to temporarily disable annotation from affecting the code?
我在我的代码中使用 IntDef from 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) {
...
那时一切都很好,但每当我想将 return 值从其他方法传递给 setLockMode()
时,问题就会出现,比如从 Parcelable 实现:
private Foo(Parcel in) {
...
setLockMode(in.getInt());
在这种情况下,我的 IDE 抱怨我只允许使用 DEFAULT, NONE, VISIBLE, TRANSPARENT
和 setLockMode()
。但是 getInt()
不是我的方法,所以我无法注释它的 return 值并让这一切都开心。我也几乎可以肯定这不是唯一的用例,但我未能找到暂时禁用 AllowedValues
注释以防止此处抱怨或 "cast" return 来自 getInt()
值的方法让 AllowedValue
不抱怨。
所以我的问题是:有什么办法可以解决这个问题吗?也许我遗漏了一些关于注释的明显信息,但也许我应该创建错误报告来让 Google 解决这个问题?
感谢任何意见或想法。
您可以通过使用以下注释来抑制方法的 IntDef
Lint 警告:
@SuppressWarnings("ResourceType")
您还可以针对单个语句和整个语句禁用这些警告 类 - 请参阅 Android Tools site 以获取更多文档。
如果仅通过在其上方插入 //noinspection ResourceType
来抑制针对该单个语句的警告,这不等同于 "making it understand the value returned by getInt()
at this point is correct" 吗?
或者,您可以向 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()));
这样的调用将不再引起警告。
我在我的代码中使用 IntDef from 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) {
...
那时一切都很好,但每当我想将 return 值从其他方法传递给 setLockMode()
时,问题就会出现,比如从 Parcelable 实现:
private Foo(Parcel in) {
...
setLockMode(in.getInt());
在这种情况下,我的 IDE 抱怨我只允许使用 DEFAULT, NONE, VISIBLE, TRANSPARENT
和 setLockMode()
。但是 getInt()
不是我的方法,所以我无法注释它的 return 值并让这一切都开心。我也几乎可以肯定这不是唯一的用例,但我未能找到暂时禁用 AllowedValues
注释以防止此处抱怨或 "cast" return 来自 getInt()
值的方法让 AllowedValue
不抱怨。
所以我的问题是:有什么办法可以解决这个问题吗?也许我遗漏了一些关于注释的明显信息,但也许我应该创建错误报告来让 Google 解决这个问题?
感谢任何意见或想法。
您可以通过使用以下注释来抑制方法的 IntDef
Lint 警告:
@SuppressWarnings("ResourceType")
您还可以针对单个语句和整个语句禁用这些警告 类 - 请参阅 Android Tools site 以获取更多文档。
如果仅通过在其上方插入 //noinspection ResourceType
来抑制针对该单个语句的警告,这不等同于 "making it understand the value returned by getInt()
at this point is correct" 吗?
或者,您可以向 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()));
这样的调用将不再引起警告。