gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:34:37 25 4
gpt4 key购买 nike

我曾经在如下界面中定义了一组相关的常量,比如 Bundle 键:

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

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

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

但是在Android上使用enums会有性能问题吗?

通过一些研究,我最终感到困惑。从这个问题 "Avoid Enums Where You Only Need Ints” removed from Android's performance tips?很明显,Google 已从其性能提示中删除了 "Avoid enums",但来自其官方培训文档 Be aware of memory overhead它清楚地表明:“枚举通常需要两倍于静态常量的内存。您应该严格避免在 Android 上使用枚举。” 这仍然有效吗? (比如 1.6 之后的 Java 版本)

我观察到的另一个问题是使用 Bundleintents 发送 enums 我应该通过序列化(即 putSerializable (),我认为与原始 putString() 方法相比,这是一个昂贵的操作,尽管 enums 免费提供它)。

有人可以澄清哪一个是在 Android 中表示相同内容的最佳方式吗?我应该严格避免在 Android 上使用 enums 吗?

最佳答案

当你需要它的特性时使用 enum不要避免它严格

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

何时使用枚举:

  • 类型检查 - 你可以接受 only 列出的值,它们不是连续的(见下文我称之为 continuous 这里)
  • 方法重载 - 每个枚举常量都有自己的方法实现

    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 上使用枚举吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29183904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com