簡體   English   中英

將字符串輸入轉換為對象名稱的實例(=輸入)

[英]convert string input to instance of object name(=input)

我有很多類,我希望用戶鍵入一個名稱,他將獲得一個特定對象(類)的同名實例。 我用這段代碼簡化了它:

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)

在最后一行,我實際上想將字符串名稱轉換為類名的實例。 有什么辦法嗎? 會有很多動物,所以我不想寫很多開關案例:“如果輸入等於獅子”或斑馬或蛇或......

我希望用戶鍵入一個名稱,他將獲得特定對象(類)的同名實例。

如果我沒錯, Class.forName()就是你要找的東西?

返回與具有給定字符串名稱的類或接口關聯的Class對象。

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

我建議在這里創建一個Factory類,為您創建合適的實例

例如:

public class AnimalFactory {

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

去吧(它使用反射):

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
    }
}

此代碼段要求所有動物子類都具有默認構造函數。

我建議你讓Animal成為一個抽象類,並引入一個AnimalFactory ,它可以創建所需的類型(這個Factory可以使用一個開關)。 您也可以引入Enum AnimalTypes而不是String表示。

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

從技術上講,這應該適合你,這只是一個片段,不確定它是否有效,如果你遇到問題,添加評論,我會讓它更通用

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();

我想你要問的是輸入名稱必須是類名,如果用戶輸入lion,則必須創建lion的實例。 如果這是條件,那么你必須使用java反射。 例如 - Class cls = Class.forName(inputUserName); 這將為您提供所需的課程。 現在為類Object創建實例clsInstance =(Object)cls.newInstance();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM