web-dev-qa-db-ja.com

列挙型とAndroid注釈intDef

私は列挙型を持っています:

_public enum AppEnums {
    SERVICE_ERROR,
    CONNECTION_ERROR;
}
_

そして、Android注釈のintDefで使用したい:

_@IntDef({AppEnums.CONNECTION_ERROR, AppEnums.SERVICE_ERROR})
public @interface ServiceErrors {
}
_

エラーが表示されます:

互換性のないタイプが見つかりました、必須: 'long'

この非互換性で何ができますか?

AppEnumパラメータの値を手動で処理したくないので、通常はEnumが自動的に値を作成します。 AppEnums.CONNECTION_ERROR.ordinal()はenumパラメータのint値を返しますが、ここでは機能しません。

38
AliSh

IntDefアノテーションの主なアイデアは、intのようなenum定数のセットを使用することですが、withoutenum。この場合、すべての定数を手動で宣言する必要があります。

@IntDef({Status.IDLE, Status.PROCESSING, Status.DONE, Status.CANCELLED})
@Retention(RetentionPolicy.SOURCE)
@interface Status {
    int IDLE = 0;
    int PROCESSING = 1;
    int DONE = 2;
    int CANCELLED = 3;
}

詳細な例を参照できます here

51
Oleksii K.

まあ、あなたはそのようにはできません。 AppEnums.SERVICE_ERRORintを返しません。 AppEnums.SERVICE_ERRORを返します。それが列挙型のポイントです。

私が提案できるのはこれです:

public static class AppEnums {
    public static final int CONNECTION_ERROR = 0;
    public static final int SERVICE_ERROR = 1;
}

@IntDef({AppEnums.CONNECTION_ERROR,AppEnums.SERVICE_ERROR})
    public @interface ServiceErrors {
}

Yazazzelloのコメントからコピー:

IntDef-Android development。 Enumには静的定数の2倍以上のメモリが必要になることがよくあります。Androidでenumを使用することは厳密に避ける必要があります 。so IntDef Enumを置き換えるように設計されている場合、Enum宣言ではIntDefを使用できません

11
Bhargav
@Retention(RetentionPolicy.SOURCE)
@IntDef({NOT_STARTED, PENDING, COMPLETED})
public @interface DownloadState {
    int NOT_STARTED = 1;
    int PENDING = 2;
    int COMPLETED = 3;
}
1
Alok Singh