在这种情况下,为什么枚举比HashMap更有用?

时间:2012-12-14 17:12:47

标签: java class enums hashmap

这似乎是一个常见的问题,但是建议框中的所有项目都没有准确地解释我在想什么。在this link中,每个人都建议使用枚举类型(我现在已经研究过,但之前从未使用过)。我打算建议简单地使用HashMap并阅读答案,看看Enum(http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html)实际上是否是更好的答案。根据oracle上的那个链接,“你应该在任何需要表示一组固定常量的时候使用枚举类型。”所以,它是。

我的问题是......为什么?是否形成一份他们不会改变的合同?它是获取某些类功能的较短方式吗?性能如何?为什么这只是在同一个类中定义常量?

谢谢!

6 个答案:

答案 0 :(得分: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;
}

如果我在集合中传递了除月份名称之外的其他内容,该怎么办?

答案 1 :(得分:3)

类型安全确实是一个很好的理由:当你将一个String传递给一个方法时,它可以是任何东西。如果您传递枚举,您确定它是合法值之一。如果可能性有限,那么枚举就很好。如果你需要扩展值,HashMaps是很好的。

答案 2 :(得分:3)

枚举是一种非常有限的数据类型,它允许您将可能的值限制为集合并在编译时避免其他值,因此如果您犯了错误,它甚至不会编译。 HashMap允许您插入许多非有效值,并且可以在运行时检测它们,但当然它仍会编译。

答案 3 :(得分:2)

你说的所有理由都非常正确。

枚举更高效,因为它存储为不可变的值列表,并且不必支持与字典一样多的操作。此外,枚举实例只是在内部存储为单个数字,并且可以像您定义自己的“静态最终整数”列表一样使用。

此外,它们还增加了类型安全性,因为您不必担心将实际数值与表示某个选项的整数进行比较;枚举只能与其他枚举进行比较。它也不能像字典那样进行修改,因此您知道在编译时给出的值在运行时将是相同的。

但是,我相信,最重要的原因是它增加的语义价值。这正是枚举的目的 - 定义一组不变的选项,并仅限于那些选项。如果你使用枚举,每个人都能够直观地理解你想要做什么。

答案 4 :(得分:1)

hashmap使用大量内存,即使你有恒定的时间查找和插入,仍然需要完成很好的处理。必须计算哈希值,然后必须解析冲突的槽等等......而枚举通常只存储在4个字节中,类型安全,效率高,并且对于其他程序员来说,显而易见的是你使用它。 / p>

另一个好处是,您可以轻松地在枚举值之间使用位运算来表示其他值。 Windows API经常这样做。

答案 5 :(得分:0)

在我看来,它们只是更快地声明和使用,并且,正如oracle所说,它们对于常数更好。枚举不能修改,所以我猜他们的资源使用量较小。