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作为一个整体似乎支持这种方法,因为它们提供了类 它会因为任何原因而优越吗 映射设计适用于动态数据,而枚举设计适用于固定数据 在这样的情况下,任何一个都可以利用,有没有 使用一种方法优于另一种方法的性能优势 无足轻重 还有一种更可取/传统的吗 只有在考虑要解决的具体问题时 更易于维护/适应 同样,这取决于你试图解决的问题 有什么经验法则我可以用来当我应该使用一个以上 另一个
是否使用编译时已知的有限、非变化的数据集。枚举是强类型的,可以有方法。性能是可以忽略不计的,直到你测量它成为一个问题;枚举不能。地图可以在运行时查找;枚举不能(没有反射)。地图可以有双向映射;枚举不能。枚举速度快;地图则不是这样。枚举是一流的,可以有方法和变量;无法映射值。