Android 语法

193 阅读1分钟

IntDef的使用

使用Enum 会增加 DEX 文件的大小,会造成运行时更多的开销,使我们的应用需要更多的空间。

  • 定义static final的常量
private static final int ADD = 0;
private static final int SUB = 1;
private static final int MUL = 2;
private static final int DIV = 3;
  • 定义一个IntDef注解,包含上面的常量,两种形式
@IntDef({ADD,SUB,MUL,DIV})
@IntDef(flag = true, value = {ADD,SUB,MUL,DIV})
第二种可以用条件进行位运算
  • 定义一个注解,表明当前@IntDef的保留策略,只保留源码中,编译时删除
@Retention(RetentionPolicy.SOURCE)

其他策略:

Class:编译时被保留,在class文件中存在,但JVM将会忽略

Runtime:将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用

  • 自定义一个注解 表明类型
public @interface Operation{}
  • 使用,在方法中使用,类型安全,替代枚举
public void operation(@Operation int opeartion) {
    switch (opeartion) {
      case ADD:
        break;
      case SUB:
        break;
      case DIV:
        break;
      case MUL:
        break;
    }
  }
  • Android 中有使用到的一个例子
public class Toast {
    static final String TAG = "Toast";
    static final boolean localLOGV = false;

    /** @hide */
    /*定义部分*/
    @IntDef({LENGTH_SHORT, LENGTH_LONG})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Duration {}

    public static final int LENGTH_SHORT = 0;
    public static final int LENGTH_LONG = 1;

    ...

    /*作为类型使用时*/
     /**
     * Set how long to show the view for.
     * @see #LENGTH_SHORT
     * @see #LENGTH_LONG
     */
    public void setDuration(@Duration int duration) {
        mDuration = duration;
    }

    /*做为返回值时*/
    /**
     * Return the duration.
     * @see #setDuration
     */
    @Duration
    public int getDuration() {
        return mDuration;
    }

}