enum与 .相比,使用时具有许多优点static final int。如果您需要这些好处,那么值得使用它。
主要区别在于使用enum您可以检查数据类型。
例如:
public class SomeClass {
public static int RED = 1;
public static int BLUE = 2;
public static int YELLOW = 3;
public static int GREEN = 3; // Совпадающие значения
private int color;
public void setColor(int color) {
this.color = color;
}
}
但是,您可以将任何值传递给类int。
new SomeClass().setColor(999);
因此,使用中存在的主要问题static final int是:
需要验证输入数据。
无法防止创建static final int具有重复值的变量。
另一个优点enum是能够重载方法。
public enum UnitConverter{
METERS{
@Override
public double toMiles(final double meters){
return meters * 0.00062137D;
}
@Override
public double toMeters(final double meters){
return meters;
}
},
MILES{
@Override
public double toMiles(final double miles){
return miles;
}
@Override
public double toMeters(final double miles){
return miles / 0.00062137D;
}
};
public abstract double toMiles(double unit);
public abstract double toMeters(double unit);
}
/** @hide */
@IntDef({VISIBLE, INVISIBLE, GONE})
@Retention(RetentionPolicy.SOURCE)
public @interface Visibility {}
/**
* This view is visible.
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int VISIBLE = 0x00000000;
/**
* This view is invisible, but it still takes up space for layout purposes.
* Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int INVISIBLE = 0x00000004;
/**
* This view is invisible, and it doesn't take any space for layout
* purposes. Use with {@link #setVisibility} and <a href="#attr_android:visibility">{@code
* android:visibility}.
*/
public static final int GONE = 0x00000008;
接收方法使用了一个特殊的注解:
public void setVisibility(@Visibility int visibility) {
setFlags(visibility, VISIBILITY_MASK);
if (mBackground != null) mBackground.setVisible(visibility == VISIBLE, false);
}
在这种情况下,您将无法为此方法使用另一个常量:
view.setVisibility(456);//Error: Must be one of: View.VISIBLE, View.INVISIBLE, View.GONE
enum与 .相比,使用时具有许多优点static final int。如果您需要这些好处,那么值得使用它。主要区别在于使用
enum您可以检查数据类型。例如:
但是,您可以将任何值传递给类
int。因此,使用中存在的主要问题
static final int是:static final int具有重复值的变量。另一个优点
enum是能够重载方法。使用的缺点
enumenum,它不应该用在顺序数据列表中。enum还需要比常规常量更多的内存来存储。IntDefStringDef在安卓系统中Google不建议在 Android 应用程序中使用
enum,因为它需要更多内存。相反,对于 Android,您可以使用IntDefandStringDef来限制常规常量的值空间。因此,您可以获得enum不浪费内存使用量的主要好处。这种做法在标准的 Android 类中无处不在:接收方法使用了一个特殊的注解:
在这种情况下,您将无法为此方法使用另一个常量:
枚举(
Enum) 可以方便地用于表示一组互斥状态。消息代码枚举示例:
消息解析示例:
使用
enuminstead of constants 很有用,例如,当您想限制方法参数的可能值集时。如果您使用常量(例如intorString),并且应该接受它的方法将具有相应的参数类型,那么没有什么可以阻止您在那里传递常量之外的东西。如果您使用enum,那么您将无法传输enum除 .Enum可以用作单例模式的实现。好处:
瑕疵
根据Joshua Bloch的说法,这是实现该模式的最佳方式