java - 不同类型 map 的 map

标签 java factory

我需要初始化几个不同类型的对象,从 XML 定义到 bean。我有目录结构:

data \
|_ plant \
|  |_ pine.xml
|  |_ cucumber.xml
|_ animal \
|  |_dog.xml
|  |_cat.xml
|_ fungus \
...

我想将其有序存储在二级 map 中:第一级 map 保存第二级 map 。每个二级 map 都包含一种类型的对象(植物/动物/真菌类......)。每个类都扩展了 Dict 类,它具有一些公共(public)字段和方法(name/getName()/setName()、desc/getDesc()/setDesc()、toString()、equals() 等。

现在,为了方便创建所有这些对象,我想要有工厂方法 Dict.fabricateAll()。问题是:如何创建二级映射,以便它们具有精确的类型参数。我不需要 HashMap 而是 HashMap、HashMap

现在我有以下代码:

public static Map<String, Map<String, ? extends Dict>> fabricateAll() {
    File topDir = new File(Dict.defDir);
    File[] subDirs = topDir.listFiles();
    Map<String, Map<String, ? extends Dict>> dicts = new HashMap<>(subDirs.length);

    String type;
    String handle;
    Map<String, ? extends Dict> dict;

    for (File subDir : subDirs) {
        type = subDir.getName(); 
        File[] xmlFiles = subDir.listFiles(new FilenameFilter() {public boolean accept(File dir, String name) { return name.toLowerCase().endsWith(".xml"); }} );
        dict = new HashMap<>(xmlFiles.length);

        for (File defFile : xmlFiles) {
            handle = defFile.getName();
            handle = handle.substring(0, handle.lastIndexOf('.')-1);

            try {
                Class c = Class.forName(type);
                Constructor bob = c.getConstructor(Class.forName("java.lang.String"));
                dict.put(handle, bob.newInstance(handle));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        dicts.put(type, dict);
    }
    return dicts;
}

但是线路有问题: dict.put(handle, bob.newInstance(handle));

错误消息:“接口(interface) Map 中的方法无法应用于给定类型。必需:字符串,CAP#1 发现:字符串,对象

是的,newInstance() 生成对象,并且可能应该进行一些强制转换,但是强制转换是什么?我不想在这里只使用“(字典)”,我更喜欢“(植物)”,“(动物)”......酌情使用。如何做到这一点?

最佳答案

将对象转换为字典。这就是多态性的好处 - 您不必引用特定的子类。您可以仅引用单个基类 Dict 来编写代码。这给你:

  • a) 松散耦合 - 对特定子类没有编译时依赖
  • b) 可扩展性 - 您可以添加子类,而无需修改此代码。

是的,有很多方法可以实现您所要求的(想到一个大的 switch 语句),但我不会推荐任何方法。

关于java - 不同类型 map 的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054346/

相关文章:

java - 尝试从 android 将图像上传到我的服务器

java - 如何在 Cordova/Phonegap 项目上设置条件 WebView 调整大小?

swift - 基于类的通用返回类型

java - 将时间对象持久化为实体而不是值类型?

swift - 如何实现符合具有类型约束的协议(protocol)的通用基类并为这些通用类型实现工厂?

java - 在 Java 中实现单例模式的有效方法是什么?

java - 用相同类型的对象替换列表中的对象,但不一定相等

angularjs - 为什么这个工厂返回一个 $$state 对象而不是 response.data?

java - 按钮文本需要根据 EditText 输入的数据进行更改

java - 枚举样式工厂作为 Java 中的内部枚举