Java 如何调用枚举函数?
我有以下问题。我试图用java实现一个HashMap,但它必须按照教授的要求来完成。他写了一个方法的大纲,以及它们应该是什么样子的,所以除了从头开始写add(key,value)函数外,我不能再做任何改变Java 如何调用枚举函数?,java,hashmap,Java,Hashmap,我有以下问题。我试图用java实现一个HashMap,但它必须按照教授的要求来完成。他写了一个方法的大纲,以及它们应该是什么样子的,所以除了从头开始写add(key,value)函数外,我不能再做任何改变 public static enum HashingMethod { DivisionMethod, KnuthMethod }; DivisionMethod和KnuthMethod都是HashFunction类中用于哈希的函数。 如果有人要使用这个
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有一个类似的示例,加上更多的示例和讨论。带有行为的枚举常量显然是枚举的预期用途之一。