I am using IntDef from Android Support annotation in my code (but my question is wider in scope so please keep reading :) like this:
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;
}
Next, I got some other methods annotated with it like this:
protected void setLockMode(@UiLockMode.AllowedValues int lockMode) {
...
At that point is all fine and nice but the problem shows up whenever I'd like to pass return value from other methods to setLockMode()
, like i.e. from Parcelable implementation:
private Foo(Parcel in) {
...
setLockMode(in.getInt());
In such case my IDE complains that I am only allowed to use DEFAULT, NONE, VISIBLE, TRANSPARENT
with setLockMode()
. But getInt()
is not my method so I cannot annotate its return value and make all this happy. I am also almost sure this is not unique use case but I failed to find the way to either temporarily disable AllowedValues
annotation from complaining here or to "cast" return value from getInt()
to make AllowedValue
not complaining.
So my questions are: is there any way of solving this problem? Maybe I am missing something obvious about annotations but maybe I shall be creating bug report to make Google address this problem instead?
Any input or thought appreciated.
public annotation IntDef. Denotes that the annotated element of integer type, represents a logical type and that its value should be one of the explicitly named constants. If the IntDef#flag() attribute is set to true, multiple constants can be combined. Example: @Retention(SOURCE)
To enable annotations in your project, add the support-annotations dependency to your library or app. Any annotations you add then get checked when you run a code inspection or lint task.
If you only suppress the warning for this single statement by inserting //noinspection ResourceType
above it, isn't this equivalent to "making it understand the value returned by getInt()
at this point is correct"?
Alternatively, you could add to UiLockMode a simple method translating from int to @UiLockMode, e.g. something along the lines of:
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;
}
Then a call like setLockMode(UiLockMode.lockModeTranslate(in.getInt()));
will no longer cause a warning.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With