Android 如何在包裹中包含带有@StringDef注释的字段?

Android 如何在包裹中包含带有@StringDef注释的字段?,android,parcelable,Android,Parcelable,我有一个带StringDef注释的接口 @StringDef({ SpecialString.A, SpecialString.B }) @Retention(RetentionPolicy.SOURCE) public @interface SpecialString { String B = "BBB"; String A = "AAA"; } 在可包裹对象的字段上使用 public class MyParcelable implements Parcela

我有一个带StringDef注释的接口

@StringDef({
    SpecialString.A,
    SpecialString.B
})
@Retention(RetentionPolicy.SOURCE)
public @interface SpecialString {
    String B = "BBB";
    String A = "AAA";
}
在可包裹对象的字段上使用

public class MyParcelable implements Parcelable {

    private final @SpecialString String mType;

    protected MyParcelable (Parcel in) {
        //Android studio shows an error for this line declaring 
        //"Must be one of SpecialString.A, SpecialString.B"
        mType = in.readString();
    }

    ...

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(mType);
    }

}

如何处理由
@StringDef
注释的字符串的打包,而不使用
//noinspection ErrorConstant

StringDef字段受Parcelable支持,但目前无法确保读回的值是可接受的值之一

在Android Studio中,通过添加注释
noinspection ErrorConstant


更安全的替代方法可能是使用枚举并使用MyEnum.valueOf(readString)读取它,或者按照Commonware的建议,编写一个整数序数或常量来代替字符串,并在读取值时进行查找。

您无法将实际字符串写入
。相反,请编写其他内容(例如,一个
int
),用于决定在读取
包裹
时使用哪一个字符串(例如,通过
开关
语句)。就我个人而言,我只会接受
不检查
。这类皮棉检查的复杂程度是有限的。正是这个问题让我意识到,我选择使用@StringDef而不是最终的静态字符串并没有从中受益。您选择使用显式注释字符串有什么特别的原因吗?这似乎是一种只强制将正确的值传递到库项目而不使用枚举的好方法。我不认为不检查条款的成本太高,但我认为会有一个更干净的解决方案