制作在该语句外部可访问的if语句中创建的类的副本(Java)

时间:2015-08-04 00:48:47

标签: java

首先,对不起,如果我没有使用关于制作课程副本的正确的话,我是Java的新手。

System.out.println("Choose a class:\nWarrior\nRouge\nCleric\nWizard\nArcher");
    String playerClass = input.nextLine();
    if (playerClass.equalsIgnoreCase("Warrior")){
        playerClass = "warrior";
        Character player = new Warrior();
    }
    if (playerClass.equalsIgnoreCase("Rouge")){
        playerClass = "rouge";
        Character player = new Rouge();
    }
    if (playerClass.equalsIgnoreCase("Cleric")){
        playerClass = "cleric";
        Character player = new Cleric();
    }
    if (playerClass.equalsIgnoreCase("Wizard")){
        playerClass = "wizard";
        Character player = new Wizard();
    }
    if (playerClass.equalsIgnoreCase("Archer")){
        playerClass = "archer";
        Character player = new Archer();
    }

以上代码是我出现问题的地方。我正在创建一个旧式的文本冒险游戏,我有一个名为Character的类。它的子类是玩家可以选择的类(向导,战士,胭脂等)。我知道在if语句之外无法访问if语句中声明的类(再次,不确定我是否使用正确的单词),但如果我没有在if语句中声明它,那么编译器将不会知道该类使用什么子类。

有没有办法在if语句之外访问类,或者在if语句之外声明类,然后在if语句中更改子类?

2 个答案:

答案 0 :(得分:4)

只需将您的变量声明在 if语句之外,然后将分配到 if语句中。这与您对playerClass变量的使用情况相同

像这样:

String playerClass = input.nextLine();
Character player = null;

if (playerClass.equalsIgnoreCase("Warrior")){
    playerClass = "warrior";
    player = new Warrior();
}
if (playerClass.equalsIgnoreCase("Rouge")){
    playerClass = "rouge";
    player = new Rouge();
}

这假设WarriorRouge,ets都是Character的子类。

答案 1 :(得分:2)

对象实例

您不创建自己创建的对象副本 instancescopy的语义是创建一个完全独立但相同的instance预先存在的instance。由于术语clone的语义,这在Java中也被称为clone

惯用语创作

final Character character; // assuming that all the instances subclass `Character`

if ("warrior".equalsIgnoresCase(playerClass)) { character= new Warrior(); }
else if ("cleric".equalsIgnoresCase(playerClass)) { character = new Cleric(); }
else if ( /* you get the idea */ ) { character= new Whatever();}
else() { throw new RuntimeException(playerClass + " is not a valid class"); }

学习使用final正确对于编写易于维护的确定性代码至关重要。

重要的是,所有if/else if/else都是排他性的,因此没有您错过的边缘情况。 character null永远不可能使用此代码正确初始化。

"SomeString".equalsIgnoreCase(variable);字面值与变量进行比较的成语String确保永远不必测试null并且不会得到{{1}在比较期间,因为NullPointerException测试已在方法内部。

这也避免了null的使用,这几乎是不合适的,并导致大量的防御性编程和难以维护的代码。您要么创建一个有效的实例,要么失败,并且您确切地知道它失败的原因。

让名为null的{​​{1}}实例令人困惑。

这应该是工厂方法模式

Character

This is just one of many Creational Patterns available to you.