使用枚举可以使用地图,反之亦然?

时间:2015-01-21 05:44:02

标签: java dictionary enums

比如说,我想制作收银机计划。忽略,为了紧凑,我不会use floats for currency我的第一直觉就是使用enum作为面额,这有点像:

private enum Currency {
        ONE_HUNDRED(100.00f),
              FIFTY( 50.00f),
             TWENTY( 20.00f),
                TEN( 10.00f),
               FIVE(  5.00f),
                TWO(  2.00f),
                ONE(  1.00f),
        HALF_DOLLAR(  0.50f),
            QUARTER(  0.25f),
               DIME(  0.10f),
             NICKEL(  0.05f),
              PENNY(  0.01f);

        private final float value;

        Currency(float value) {
            this.value = value;
        }

        public float getValue() {
            return this.value;
        }

        @Override
        public String toString() {
            return this.name().replace("_", " ");
        }
    }

但是最后我跟着本能,没有预见到,并为莫尔斯电码转换器做了类似的事情,有人建议我使用地图,明确地使用Bimap。我看到该集合在该特定场景中的吸引力,但一般来说我想询问是否有任何理由在另一个可以使用时更喜欢一个?如果不是上面的代码,我就这样做了:

Map<String, Float> currency = new LinkedHashMap<>();

    currency.put("One Hundred", 100.00f);
    currency.put("Fifty", 50.00f);
    currency.put("Twenty", 20.00f);
    currency.put("Ten", 10.00f);
    currency.put("Five", 5.00f);
    currency.put("Two", 2.00f);
    currency.put("One", 1.00f);
    currency.put("Half Dollar", 0.50f);
    currency.put("Quarter", 0.25f);
    currency.put("Dime", 0.10f);
    currency.put("Nickel", 0.05f);
    currency.put("Penny", 0.01f);

出于任何原因它会优越吗?

在这些情况下,如果可以使用,那么使用一个在另一个上是否有任何性能优势?是一个更优选/传统?更易维护/适应性强?

当我应该使用一个而不是另一个时,我可以使用任何经验法则吗?

4 个答案:

答案 0 :(得分:1)

以下是我要记住的事项:

最好使用枚举(以我所知的语言,只能使用),以提前定义一组已知的项目。这有一个很好的好处,可以归结为经常使用的数据&#34;数据&#34;作为代码以一种非常易读的方式。

在我看来,任何依赖于频繁硬编码字符串的代码,就像在地图中实现类似数据时需要使用的代码更难以阅读和维护。这导致了#34;魔术字符串&#34;,这是可以避免的禁止。

在你去检查之前,地图上不应该立即清楚地知道应该存在什么,并且不清楚它是否可能在其他地方被修改。考虑一下,如果你的枚举值错误,代码甚至都不会编译。获取字符串键错误,直到很久之后才会注意到。

关于表现,我怀疑两者之间存在很大差异。枚举的处理方式与对象大致相同,我认为好处来自于访问数据作为对象上的字段而不是哈希查找。

这篇文章并没有像我想的那样深入,但可能是一个很好的起点:Memory Consumption of Java Data Types

通常的做法是使用枚举作为已知地图的键,并提供另一种将数据与一组特定项目相关联的方式(而不是将它们设置为枚举中的字段)。我相信这种方法将是我的首选方法,因为在枚举上设置大量字段会使它们感觉太像一个类而不是一个引用方法。这与普通地图没有相同的问题,因为由于密钥必须是枚举,因此您不必担心任何其他密钥&#34;意外地&#34;被添加到地图中。似乎Java作为一个整体支持这种方法,因为它们提供EnumMap类。

答案 1 :(得分:0)

我想说,你的两段代码之间的主要区别在于,在enum的情况下,你有固定的面额列表是“类型安全的”。在使用字符串和地图进行操作时,很容易拼错一些字符串,引入难以发现的错误。

答案 2 :(得分:0)

我会在这种情况下使用枚举它更明智,如果这是其他人使用的内容枚举,如果你使用几乎任何ide,你会显示相关的值,就好像你在使用地图既不是密钥也不是值可供您使用。还有其他原因,但这是我想到的原因。

答案 3 :(得分:0)

  

出于任何原因它会优越吗?

地图设计适用于动态数据,而枚举设计适用于固定数据。

  

在这些情况下,要么可以使用,还有其他   使用一个在另一个上的性能优势?

微不足道。

  

更优选/传统吗?

只考虑要解决的具体问题。

  

更易于维护/适应性?

同样,这取决于你想要解决的问题。

  

当我应该使用一个时,我可以使用任何经验法则吗?   另一个?

您是否正在使用编译时已知的有限的,不变的数据集。

相关问题