2013-05-03 101 views
0

我有反射哈希码?

interface Module { 
    List<String> parse(); 
} 

有接口的几种实现和应用程序,我想有一个HashSet<Module>确保有每个模块只有一个实例。为此,我需要为每个班级提供适当的hashCodehashCode的正确实现将为一个模块类的不同实例返回相同的常量,但对于不同的模块将返回不同的实例。

要创建一个不错的设计方案,我想从像模块的名称计算的hashCode:

public int hashCode() { 
    return ConcreteModule.class.getName().hashCode(); 
} 

但是这个代码将是接口的每一种实现......我的想法是相同的创建一个实现哈希码的抽象模块,但有可能达到扩展此抽象类的类的名称? 像:

public abstract class AbstractModule implements Module { 
    public int hashCode() { 
     // get the class name of class extending the abstract module 
     // and return hashcode of its string name 
    } 
} 

然后

public class ConcreteModule extends AbstractModule implements Module { 
    // implementation of parse() no need to create hashcode for each module 
} 

你会建议为每个模块创建哈希码或者是可以创造的东西我想?任何建议或意见,欢迎。在此先感谢

+0

“每个模块只有一个实例”你是指每个实现类型?听起来你只需要一个'Dictionary '。 – 2013-05-03 17:43:32

+0

这里不应该有一个单身人士符合法案吗? – CAFxX 2013-05-03 17:48:31

+0

@JonSkeet是的,我的意思是最多可以有一个ConcreteModule1的实例,但也可以有一个ConcreteModule2的实例等等......您是否建议将它制作成像<“header”,HeaderModule>,< “Another”,AnotherModule>等等? – kuncajs 2013-05-03 17:48:48

回答

1

你可以简单地实现它类似如下:

@Override 
public final int hashCode() { 
    return this.getClass().getName().hashCode(); 
} 

@Override 
public final boolean equals(Object other) { 
    if (other == this) { 
     return true; 
    } 
    if (other == null) { 
     return false; 
    } 
    return other.getClass().equals(this.getClass()); 
} 

但我不确定这是最好的主意。而且,你不能保证接口的所有实现扩展你的抽象类。

您可以简单地维护一个Map<Class<? extends Module>, Module>。每个模块实现都将自己添加到注册表中,并且如果该模块的类已经在映射中,那么您只需拒绝或忽略新的模块实例。

+0

那么,最后我实现了这些类作为服务和服务加载器注意只有一个(加载为单身人士)。但是,感谢您的推荐,它指导我以更好的方式! – kuncajs 2013-05-05 10:50:07

1

怎么样:

return getClass().getName().hashCode(); 

虽然,你可以很容易地使用:

return getClass().hashCode(); 
2

经过一番思考,你想要做什么是关键的地图关类,而不是实例....

HashMap<Class<? extends Module>, <Module>> mymap = ..... 

然后,你必须为每个类类型只有一个值。你可以把:

mymap.put(module.class(), module); 
+0

不需要IdentityHashMap,普通的一个就可以正常工作。 – jtahlborn 2013-05-03 18:19:13

+0

为真。编辑或不编辑。当然,我会编辑。 – rolfl 2013-05-03 18:20:39