Java 在可以使用映射的情况下使用枚举是否有好处,反之亦然?

Java 在可以使用映射的情况下使用枚举是否有好处,反之亦然?,java,dictionary,enums,Java,Dictionary,Enums,比如说,我想做一个收银机程序。忽略这一点,为了简洁起见,我的第一反应是使用枚举作为面额,大致如下: private enum Currency { ONE_HUNDRED(100.00f), FIFTY( 50.00f), TWENTY( 20.00f), TEN( 10.00f), FIVE( 5.00f), TWO( 2.00

比如说,我想做一个收银机程序。忽略这一点,为了简洁起见,我的第一反应是使用枚举作为面额,大致如下:

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("_", " ");
        }
    }
但上一次我出于本能,毫无先见之明,为摩尔斯电码转换器做了类似的事情,有人建议我用地图代替,明确地说是地图。我看到了该系列在特定场景中的吸引力,但总的来说,我想问一下,当另一个可以使用时,是否有任何理由选择其中一个?如果我没有使用上述代码,而是执行以下操作:

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);
Map currency=newlinkedhashmap();
货币。卖出价(“一百”,100.00f);
货币。卖出价(“五十”,50.00f);
货币。卖出价(“二十”,20.00f);
货币。卖出价(“十”,10.00f);
货币。卖出价(“五”,5.00f);
货币。卖出价(“两”,2.00f);
货币。卖出价(“一”,1.00f);
货币卖出价(“半美元”,0.50f);
货币认沽期权(“季度”),0.25f;
货币。卖出价(“一角”,0.10f);
货币卖出价(“镍”,0.05f);
货币。卖出价(“便士”,0.01f);
它会因为任何原因而优越吗

在这样的情况下,两者都可以被利用,使用一个比另一个有什么性能优势?还有一种更可取/传统的吗?更易于维护/适应


当我应该使用其中一个而不是另一个时,有什么经验法则可以使用吗?

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

在这种情况下,我会使用enum,它更合理,如果其他人使用它,enum会为您显示相关的值,如果您使用的几乎是任何ide,如果您使用的是地图,则键或值都不可用。还有其他原因,但这是我想到的原因。

以下是我想记住的事情:

枚举最好用于(在我所知道的语言中,可能仅用于)提前定义一组已知的项。这有一个很好的好处,就是以一种非常可读的方式将真正归结为经常使用的“数据”作为代码处理

在我看来,任何依赖于频繁硬编码字符串的代码(如在映射中实现这样的数据时需要使用的代码)都更难读取和维护。这导致了“魔术弦”,这是一个不可以避免的

在你去检查之前,还不清楚地图上应该存在什么,也不清楚它是否可能在其他地方被修改。考虑一下,如果EnUM值错误,代码甚至不会编译。如果字符串键出错,您可能要过很久才会注意到

关于表现,我怀疑两者之间有很大的区别。枚举在很大程度上被视为与对象相同,我认为其好处在于将数据作为对象上的字段而不是散列查找来访问

这篇文章并不像我想的那样深入,但可能是一个很好的起点:

使用枚举作为已知映射的键是非常常见的做法,它提供了另一种将数据与一组特定项关联的方法(而不是将它们设置为枚举上的字段)。我相信这种方法将是我的首选方法,因为在枚举上设置大量字段会使它们感觉太像类而不是引用方法。这与普通映射没有相同的问题,因为键必须是枚举,所以您不必担心任何其他键“意外”添加到映射中。Java作为一个整体似乎支持这种方法,因为它们提供了类

它会因为任何原因而优越吗

映射设计适用于动态数据,而枚举设计适用于固定数据

在这样的情况下,任何一个都可以利用,有没有 使用一种方法优于另一种方法的性能优势

无足轻重

还有一种更可取/传统的吗

只有在考虑要解决的具体问题时

更易于维护/适应

同样,这取决于你试图解决的问题

有什么经验法则我可以用来当我应该使用一个以上 另一个


是否使用编译时已知的有限、非变化的数据集。

枚举是强类型的,可以有方法。性能是可以忽略不计的,直到你测量它成为一个问题;枚举不能。地图可以在运行时查找;枚举不能(没有反射)。地图可以有双向映射;枚举不能。枚举速度快;地图则不是这样。枚举是一流的,可以有方法和变量;无法映射值。