当前位置: 首页 > 面试题库 >

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

刘弘济
2023-03-14
问题内容

我曾经Bundle在如下所示的接口中一起定义了一组相关的常量(如键):

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

这为我提供了一种更好的方式将相关常量分组在一起,并通过进行静态导入(而非实现)来使用它们。我知道Android框架也使用像一样的常量Toast.LENTH_LONGView.GONE

但是,我经常感到,Java Enums提供代表常数的更好,更强大的方法。

但是使用enumson 会有性能问题Android吗?

经过一番研究,我最终陷入了混乱。从这个问题中,
从Android的性能提示中删除了“避免枚举,您只需要整数吗?”很明显,Google它已从性能提示中删除了
“避免枚举”
,但是从官方培训文档中请注意内存开销部分,它明确指出:
_“枚举通常需要的内存是静态常量的两倍以上。 您应严格避免在Android上使用枚举。”_这仍然有效吗?(例如Java1.6以后的版本)

还有一个问题,我观察到的是发送enumsintents使用Bundle我应该序列化给他们(即putSerializable(),我认为一个昂贵的操作比较原始的putString()方法沉绵enums免费提供的话)。

有人可以说清楚哪一种是代表同一个人的最佳方法Android吗?我应该严格避免使用enumson Android吗?


问题答案:

enum需要其功能时使用。 不要 严格 避免它

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字节+ 对象的开销
  • 枚举类本身占用一些空间

常量占用更少的空间

  • 常量没有引用,因此它是纯数据(即使是引用,枚举实例也将是对另一个引用的引用)
  • 常量可以添加到现有类中-不必添加其他类
  • 常量可以内联;它带来了扩展的编译时功能(例如,空检查,查找无效代码等)


 类似资料:
  • 我曾在如下界面中定义一组相关常量,如

  • 问题内容: 有时是有用的,例如,如果我为网站上的所有链接(例如选择器)定义了通用样式,但是当我要覆盖某些规则时,可以有以下选择: 使用更具体(更长)的选择器 采用 哪种方法更好,可能有一些指导原则? 问题答案: 使用非常,非常谨慎- 它会覆盖刚才的一切,甚至是内联样式和混乱在低于显而易见的方式与样式规则“梯级”,让CSS的名字。它很容易使用不当,而且容易成倍增加,尤其是在滥用时。您可以轻松地得出一

  • 问题内容: 我读到应该避免赞成和。我对弄乱Loop并没有信心,也没有完全理解Codex。 下面的代码是否使用?如果是,并且由于应该避免,那么您能建议一种不使用但仍然完成相同任务的方法吗? 此代码用于按随机或按价格对帖子进行排序。 。 使用此代码将链接A(随机)和链接B(价格)发布在我的菜单中。因此,网站的访问者只需单击链接即可对帖子进行排序。 问题答案: 我已经针对WPSE这个主题做了非常详细的解

  • 问题内容: 今天,我有一个同事建议我重构代码,以使用label语句控制通过我创建的2个嵌套的for循环的流。我以前从未使用过它们,因为我个人认为它们会降低程序的可读性。如果论点足够扎实,我愿意改变使用它们的想法。人们对标签陈述有何看法? 问题答案: 如果您可以跳过两个循环(或一个包含switch语句的循环),则许多算法的表达会更容易。不要为此感到难过。另一方面,它可能表明解决方案过于复杂。因此,退

  • 对于与PropertyValueFactory相关的问题,许多回答(和评论)建议避免使用该类和其他类似类。使用这个类有什么问题?

  • 问题内容: 在某些情况下,我喜欢将缓冲显示为的功能,这会给我带来好处,但程序包名称使我有点担心在生产代码中使用它。我了解它 主要 用于测试,但是不确定我是否在生产代码中使用它时遇到麻烦。 我在吸引命运吗? 问题答案: 您不应在生产中使用此代码。无论您要实现什么目标。 最终目的是促进 测试 ,因此始终会在考虑测试的情况下进行扩展,优化( 重写) 。只要可以使该软件包更好地进行测试,就可以在该软件包中