java – 我应该严格避免在Android上使用枚举吗?

我曾经在一个接口中定义了一组相关的常量,如Bundle keys,如下:

public interface From{
    String LOGIN_SCREEN = "LoginSCreen";
    String NOTIFICATION = "Notification";
    String WIDGET = "widget";
}

这为我提供了一个更好的方式将相关的常量组合在一起,并通过静态导入(不实现)来使用它们。我知道Android框架也使用常量以相同的方式像Toast.LENTH_LONG,View.GONE。

然而,我经常觉得Java Enums提供了更好和更强大的方式来表示常量。

但在Android上使用枚举是否有性能问题?

有了一点研究,我最终在混乱。从这个问题
“Avoid Enums Where You Only Need Ints” removed from Android’s performance tips?很明显,谷歌已经删除了“避免枚举”的性能提示,但从它的官方培训文档Be aware of memory overhead部分,它清楚地说:“枚举常常需要比静态常量多两倍的内存。你应该严格避免使用枚举在Android “。这是否仍然不错? (说在1.6之后的Java版本)

我观察到的另一个问题是使用Bundle发送枚举,我应该发送序列化(即putSerializable(),我认为昂贵的操作相比原始putString()方法,eventhough枚举提供它免费)。

有人可以澄清哪一个是最好的方式来表示相同的Android?我应该严格避免在Android上使用枚举?

最佳答案
当您需要它的功能时使用枚举。不要严格避免。

Java枚举更强大,但如果你不需要它的特性,使用常量,它占用更少的空间,它们可以是原始本身。

何时使用枚举:

>类型检查 – 你只能接受列出的值,并且它们不是连续的(见下文我称为连续的)
>方法重载 – 每个枚举常量都有自己的方法实现

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);
}

>更多数据 – 您的一个常量包含多个不能放入一个变量的信息
>复杂的数据 – 你的常量需要方法来操作数据

当不使用枚举时:

>你可以接受一个类型的所有值,你的常量只包含这些最常用的
>您可以接受连续数据

public class Month{
    public static final int JANUARY = 1;
    public static final int FEBRUARY = 2;
    public static final int MARCH = 3;
    ...

    public static String getName(final int month){
        if(month <= 0 || month > 12){
            throw new IllegalArgumentException("Invalid month number: " + month);
        }

        ...
    }
}

>用于名称(如在您的示例中)
>对于其他一切真正不需要枚举的

枚举占用更多的空间

>单个引用枚举常量占用4个字节
>每个枚举常量占用空间,它是其字段大小与对象的8字节开销对齐的总和
>枚举类本身占用了一些空间

常数占用的空间较小

>一个常量没有引用,所以它是一个纯数据(即使它是一个引用,然后枚举实例将引用另一个引用)
>常量可以添加到现有类中 – 不需要添加另一个类
>常数可以内联;它带来了扩展的编译时功能(如空检查,查找死代码等)

转载注明原文:java – 我应该严格避免在Android上使用枚举吗? - 代码日志