java - 来自反射的哈希码?

标签 java reflection hashcode

我有

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

该接口(interface)有多种实现方式,在应用程序中我希望有一个 HashSet<Module>这确保每个模块只有一个实例。为此,我需要一个合适的 hashCode每个类(class)。正确实现hashCode将为一个模块类的各种实例返回相同的常量,但为不同的模块返回不同的常量。

为了创建一个好的设计解决方案,我想根据模块名称计算 hashCode,例如:

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

但是这个代码对于接口(interface)的每个实现都是相同的...我的想法是创建一个实现哈希码的抽象模块,但是是否有可能到达扩展这个抽象类的类的名称? 喜欢:

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
}

您是否建议为每个模块创建 hashCodes,或者是否可以创建我正在尝试的东西?欢迎任何建议或意见。提前致谢

最佳答案

经过一番思考,您想要做的是将映射从类中删除,而不是实例......

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

那么每种类类型只有一个值。您可以放置​​:

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

关于java - 来自反射的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16364724/

相关文章:

Java - 解析对其他类的方法调用

c# - 为什么某些 C# lambda 表达式会编译为静态方法?

java - Java 对象的多个 HashCode

java - 来自 .html 的请求中的空参数列表将多部分/表单数据表单发布到 servlet 2.5 或 3.0

java - Java 中只允许对对象实例进行单一引用的最佳方法

java - 工作进程响应 rabbitmq 消息的长时间运行进程

c# - 使用反射和锁定正确实例化分配给私有(private)静态 volatile 变量的类

haskell - Haskell 反射中的黑魔法

scala - `##` 和 `hashCode` 和有什么区别?

java - 哈希集中链表桶的最大长度?