【问题标题】:Why would enum be more useful than a HashMap in this situation?在这种情况下,为什么枚举比 HashMap 更有用?
【发布时间】:2012-12-02 17:26:12
【问题描述】:
【问题讨论】:
标签:
java
class
enums
hashmap
【解决方案1】:
你说的所有理由都非常正确。
枚举更有效,因为它存储为不可变的值列表,并且不必像字典那样支持那么多的操作。此外,枚举实例只是在内部存储为单个数字,可以像定义自己的“静态最终整数”列表一样使用。
此外,它们还增加了类型安全性,因为您不必担心将实际数值与表示某个选项的整数进行比较;枚举只能与其他枚举进行比较。它也不能像字典那样被修改,所以你知道在编译时给出的值在运行时将是相同的。
但是,我相信,最重要的原因是它增加了语义价值。这正是枚举的目的——定义一组不变的选项并将自己限制在这些选项中。如果您使用枚举,每个人都将能够直观地理解您要做什么。
【解决方案2】:
hashmap 使用大量内存,即使您有持续的时间查找和插入,仍然需要进行良好的处理。必须计算散列,然后必须解决冲突的插槽等...而枚举通常仅存储在 4 个字节中,是类型安全的,高效,并且对其他程序员来说很明显你正在使用它。
另一个好处是您可以轻松地在枚举值之间使用位算术来表示其他值。 Windows API 经常这样做。
【解决方案3】:
枚举实例是对象,就像任何其他对象一样封装数据和行为。通过传递枚举实例,任何人都可以调用它的方法。例如,如果您将 Map 键作为字符串传递,则您无法对键执行任何有用的操作。此外,代码的类型安全性和自文档性较差,因为 String 很可能与应有的完全不同。
什么是最易读的?
public int countDays(Set<Month> months, int year) {
int count = 0;
for (Month month : months) {
count += month.getDays(year);
}
return count;
}
或
public int countDays(Set<String> months, int year) {
int count = 0;
for (String month : months) {
int days = monthMap.get(month);
if (month.equals(Months.FEBRUARY)) {
days = computeDaysInFebruary(year);
}
count += days;
}
return count;
}
如果我在集合中传递的不是月份名称怎么办?
【解决方案4】:
枚举是一种非常有限的数据类型,它允许您将可能的值限制在一个集合中并在编译时避免其他值,因此如果您犯了错误,它甚至不会编译。 HashMap 可以让您插入许多无效值,努力在运行时检测到它们,但当然它无论如何都会编译。
【解决方案5】:
类型安全确实是一个很好的理由:当您将 String 传递给方法时,它可以是任何东西。如果你传递一个枚举,你确定它是合法值之一。如果可能性有限,枚举是好的。如果您需要扩展值,HashMaps 很好。
【解决方案6】:
在我看来,它们只是更快地声明和使用,而且,正如 oracle 所说,它们更适合常量。枚举不能修改,所以我猜它们的资源使用量较小。