【问题标题】:convert string input to instance of object name(=input)将字符串输入转换为对象名称的实例(=输入)
【发布时间】:2014-05-07 23:24:33
【问题描述】:

我有很多类,我希望用户输入一个名称,他将获得特定对象(类)的同名实例。我用这段代码简化了它:

public class Animal {...}

public class lion extends Animal{...}
public class zebra extends Animal{...} // and so on for a lot of animals

String name = input from user
Animal something = new Animal(instance of the input name)

在最后一行我实际上想将字符串名称转换为类名的实例。有什么办法吗? 会有很多动物,所以我不想写很多开关案例:“如果输入等于狮子”或斑马或蛇或......

【问题讨论】:

  • if (name.equals("zebra")) {...} else if (name.equals("lion")) {...} 的可能性如何?
  • 您的问题不清楚。你想做的事

标签: java string object instanceof


【解决方案1】:

我建议在这里创建一个Factory 类,为您创建合适的实例

例如:

public class AnimalFactory {

    public Animal getAnimal(String input) {
        if(input.equals("lion")) {
            return new lion();
        } else if(input.equals("zebra")) {
            return new zebra();
        }
    }
}

【讨论】:

    【解决方案2】:

    我希望用户输入一个名称,他将获得特定对象(类)的同名实例。

    Class.forName() 是你要找的东西,如果我没记错的话?

    返回与具有给定字符串名称的类或接口关联的 Class 对象。

    Object obj = Class.forName(user_enterd_name).newInstance();
    

    【讨论】:

    • 我试过了,也许我做错了什么,但它不起作用。对象 obj = Class.forName("lion").newInstance();日食说:这一行有多个标记 - 未处理的异常类型 InstantiationException - 未处理的异常类型
    • 那是因为 Class.forName().newInstance() 抛出了多个需要捕获的异常。这段代码在 Eclipse 中为我编译:try { Class.forName("className").newInstance(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }
    【解决方案3】:

    我建议您将Animal 设为抽象类并引入AnimalFactory,它会为您创建所需的类型(此工厂可能使用开关)。您也可以引入 Enum AnimalTypes 而不是您的字符串表示形式。

    public class AnimalFactory {
    
        public Animal create(AnimalType animal) {
            switch (animal) {
                case lion: return new lion(); break;
                case dog: return new dog(); break;
                default: break;
            }
        }
    }
    

    你的“动物”都扩展了抽象类Animal

    【讨论】:

      【解决方案4】:

      从技术上讲,这应该对您有用,这只是一个 sn-p,不确定它是否有效,如果您遇到问题,请添加评论,我会使其更通用

      Map<String, Class> classes = new HashMap<>();
      classes.put("zebra", Zebra.class);
      classes.put("lion", Lion.class);
      classes.put("etc", Etc.class);
      
      Animal aClass = classes.get(animalName).newInstance();
      

      【讨论】:

        【解决方案5】:

        去吧(它使用反射):

        public static Animal createAnimal(String name) {
            try {
                String package = "your.pkg"; // assuming all classes resume in the same package
                String fqn = package + "." + name;
                Class<?> animalClass = Class.forName(fqn);
                return (Animal) animalClass.newInstance();
            } catch (Exception e) {
                return null; // react to any exception here
            }
        }
        

        这段代码 sn-p 要求所有动物子类都有一个默认构造函数。

        【讨论】:

          【解决方案6】:

          我猜你想问的是输入名称必须是类名,如果用户输入lion,则必须创建lion实例。 如果是这种情况,那么您必须使用 java 反射。 例如 - Class cls = Class.forName(inputUserName); 这将为您提供所需的课程。 现在为类创建实例 Object clsInstance = (Object) cls.newInstance();

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-10
            • 2019-09-06
            • 2023-01-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多