Java 如何调用枚举函数?

Java 如何调用枚举函数?,java,hashmap,Java,Hashmap,我有以下问题。我试图用java实现一个HashMap,但它必须按照教授的要求来完成。他写了一个方法的大纲,以及它们应该是什么样子的,所以除了从头开始写add(key,value)函数外,我不能再做任何改变 public static enum HashingMethod { DivisionMethod, KnuthMethod }; DivisionMethod和KnuthMethod都是HashFunction类中用于哈希的函数。 如果有人要使用这个

我有以下问题。我试图用java实现一个HashMap,但它必须按照教授的要求来完成。他写了一个方法的大纲,以及它们应该是什么样子的,所以除了从头开始写add(key,value)函数外,我不能再做任何改变

public static enum HashingMethod {
        DivisionMethod,
        KnuthMethod
    };
DivisionMethod和KnuthMethod都是HashFunction类中用于哈希的函数。 如果有人要使用这个程序,他会首先创建一个HashMap类的实例:
HashMap hm=newhashmap(6,HashFunction.HashingMethod.DivisionMethod)

然后使用
hm.add(3,“救护车”)
向其中添加元素

以下是HashMap的构造函数:

public HashMap(int m, HashFunction.HashingMethod h) {
        this.h = h;
        this.table = new LinkedList[m];
        for (int i=0; i<table.length; i++) {
            table[i] = new LinkedList<Element>();
        }
    }
public HashMap(int m,HashFunction.HashingMethod h){
这个,h=h;
this.table=新链接列表[m];

对于(int i=0;i您似乎正在将
散列方法
存储在名为
h
的字段中

要检查所选方法,请执行以下操作:

if (h == HashFunction.HashingMethod.DivisionMethod) {

    // use division method

}

等等。

您只需切换即可:

switch(this.h) {
    case DivisionMethod: /*code*/; break;
    case KnuthMethod: /*code*/; break;
}

我将向enum添加一个抽象方法,这样就不需要
if
switch

public static enum HashingMethod {
    DivisionMethod {
        @Override
        public int calcHash(Object o) {
            // do it
        }
    },
    KnuthMethod {
        @Override
        public int calcHash(Object o) {
            // do it
        }
    };

    public abstract int calcHash(Object o);
}
因此,您可以直接调用enum方法

int bucket = this.h.calcHash(e);

在这种情况下,您最好的选择可能是实际将哈希函数作为枚举的一种方法包含在内。另外,请注意命名约定:枚举常量应全部大写,并带有分隔单词的
\uu
字符。您的HashMap实现可能具有实例变量HashingMethod。基于此变量你可以决定在add(key,value)方法中使用哪个散列函数。请注意put(key,value)更合适-映射接口声明此方法。我正在删除我的答案。将行为添加到枚举是一种糟糕的做法。枚举的规范将它们定义为常量值,许多框架都是这样处理的,因此添加方法只是在修复它为时已晚的情况下带来麻烦。如果您阅读了规范/JVM枚举,则它们被设计为CON常量值。向它们添加行为只会使事情变得复杂。当问题出现时,要有效地解决它就为时已晚。添加行为不会改变它们是常量的事实。如果小心使用,它可能是一个非常好的工具。当然,它也经常被滥用,用于将常量从一个域或层转换到另一个域或层,链接g枚举实现中的那些域或层…如中所述“比在基类型中使用switch语句安全得多”。是的。有效Java项目30有一个类似的示例,加上更多的示例和讨论。带有行为的枚举常量显然是枚举的预期用途之一。