如何根据用户输入设置enum的值



我试图创建一个方法,通过该方法我可以返回由用户输入设置的enum的值。我声明了一个枚举,然后尝试根据用户输入设置枚举。我无法使用我的GetPlayerClass方法来返回Player_Class的值。有人可以告诉我,如果这是正确的方式来使用枚举来设置一个值,或者有一种方法,我可以允许用户从枚举列表中选择,让我得到他们的选择。

我的代码如下。

TLDR:我是"enum哑巴",无法弄清楚如何从枚举中设置变量的值,然后返回该值。请查看我的代码,让我知道我做错了什么。

  // The PCs base class
    private enum Base_Class {
        Barbarian, Bard, Cleric, Druid, Fighter, Monk, 
        Paladin, Ranger, Rogue, Sorcerer, Wizard
    };

 // Setting the base class
 public void setBaseClass() {
        do {
            System.out.println("Available Classes: ");
            System.out.println("Please select a cooresponding number for class.");
            int i = 1;
            for(Base_Class value: Base_Class.values()){
                System.out.println(i+": "+value.name());
                i++;
            }
            try {
                Base_Class_Choice = user_input.nextInt();
                switch(Base_Class_Choice) {
                    case 1:
                        Base_Class Player_Class;
                        Player_Class = Base_Class.Barbarian;
                        break;
                    case 2:
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
                System.out.println("You must choose a valid class. Try numbers.");
                user_input.next();
            }
        } while (Base_Class_Choice == 0);
    }
    /**
     * Return my players class
     * @return
     */
    public String getPlayerClass() {
        return Player_Class;
    }
我更新了下面的代码我的尝试区域现在看起来像这样。
    try {
                Base_Class_Choice = user_input.nextInt();
                Base_Class Player_Class = Base_Class.values()[Base_Class_Choice - 1];
            } catch (Exception e) {
                System.out.println("You must choose a valid class. Try numbers.");
                user_input.next();
            }

但是返回的Base_Class Player_Class不工作。

    public String getPlayerClass() {
        return Player_Class;
    }

当我尝试返回Player_Class时,它仍然失败,错误无法找到符号。我还能做错什么吗?

更新! !"所有的代码!!"

/*
 * 
 * 
 */
package rpgmanager;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
/**
 *
 * @author Aaron
 */
public class Character {
        // The person playing the character
        private String Player_Name;
        // The PCs First Name
        private String First_Name;
        // The PCs Last Name
        private String Last_Name;
        // The PCs Race
        private enum Race {
            Dwarf, Halfling, Elf, Human, Gnome, HalfOrc, HalfElf
        };
        // The PCs base class
        private enum Base_Class {
            Barbarian, Bard, Cleric, Druid, Fighter, Monk, 
            Paladin, Ranger, Rogue, Sorcerer, Wizard
        };
        private Base_Class Player_Class;
        // Base Class Choice for switch case
        private int Base_Class_Choice = 0;
        // The PCs Height
        private int Height = 0;
        // The PCs Weight
        private int Weight = 0;
        // The PCs Age
        private int Age = 0;
        // The PCs base level
        private int Base_Level;
        // Sets up the scanner for inputs
        Scanner user_input = new Scanner(System.in);
        // Create a Buffered reader for input
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        // This instantiates a new character
        public Character() {
        }
        /**
         * Sets the PCs first name
         */
        public void setPlayerName() {
            System.out.print("Players Name: ");
            try {
                Player_Name = reader.readLine(); 
            } catch (IOException ioe) {
                System.out.println("The Player Name input failed to set.");
                System.out.println(ioe);
            }
        }
        /**
         * Sets the PCs first name
         */
        public void setFirstName() {
            System.out.print("First Name: ");
            try {
                First_Name = reader.readLine();
            } catch (IOException ioe) {
                System.out.println("The PCs First Name input failed to set.");
                System.out.println(ioe);
            }
        }
        /**
         * Sets the PCs last name
         */
        public void setLastName() {
            System.out.print("Last Name: ");
            try {
                Last_Name = reader.readLine();
            } catch (IOException ioe) {
                System.out.println("The PCs Last Name input failed to set.");
                System.out.println(ioe);
            }
        }
        /**
         * Sets the height of the PC
         */
        public void setHeight() {
            do {
                System.out.print("Height (inches): ");
                try {
                    Height = user_input.nextInt();
                    if(Height < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch(Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Height < 1);
        }
        /**
         * Sets the weight of the PC
         */
        public void setWeight() {
            do {
                System.out.print("Weight (pounds): ");
                try {
                    Weight = user_input.nextInt();
                    if (Weight < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Weight < 1);
        }
        /**
         * Sets the age of the PC
         */
        public void setAge() {
            do {
                System.out.print("Age (whole years): ");
                try {
                    Age = user_input.nextInt();
                    if (Age < 1) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must use a number greater than 0!");
                    user_input.next();
                }
            } while (Age < 1);
        }
        /**
         * Sets the base level of the PC
         */
        public void setBaseLevel() {
            do {
                System.out.print("Starting Level: ");
                try {
                    Base_Level = user_input.nextInt();
                    if (Base_Level < 1 || Base_Level > 25) {
                        System.out.println("Not a valid number.");
                    }
                } catch (Exception e) {
                    System.out.println("You must choose a valid level between 1 and 25!");
                    user_input.next();
                }
            } while (Base_Level < 1 || Base_Level > 25);
        }
        public void setBaseClass() {
            do {
                System.out.println("Available Classes: ");
                System.out.println("Please select a cooresponding number for class.");
                int i = 1;
                for(Base_Class value: Base_Class.values()){
                    System.out.println(i+": "+value.name());
                    i++;
                }
                try {
                    Base_Class_Choice = user_input.nextInt();
                    Base_Class Player_Class = Base_Class.values()[Base_Class_Choice - 1];
                } catch (Exception e) {
                    System.out.println("You must choose a valid class. Try numbers.");
                    user_input.next();
                }
            } while (Base_Class_Choice == 0);
        }
        /**
        * Gets the PCs first name
        * @return 
        */
        public String getFirstName() {
            return First_Name;
        }
        /**
         * Gets the PCs last name
         * @return 
         */
        public String getLastName() {
            return Last_Name;
        }
        /**
         * Gets the PCs height
         * @return 
         */
        public int getHeight() {
            return Height;
        }
        /**
         * Gets the PCs age
         * @return 
         */
        public int getAge() {
            return Age;
        }
        /**
         * Gets the PCs base level (1-25)
         * @return
         */
        public int getBaseLevel() {
            return Base_Level;
        }
        /**
         * Gets the PCs player name
         * @return
         */
        public String getPlayerName() {
            return Player_Name;
        }
        /**
         *
         * @return
         */
        public Base_Class getPlayerClass() {
            return Player_Class;
        }
        /**
         *  Creates a new character
         */
        public void createCharacterNew() {
            this.setPlayerName();
            this.setFirstName();
            this.setLastName();
            this.setHeight();
            this.setWeight();
            this.setAge();
            this.setBaseLevel();
            this.setBaseClass();
        }
}

只要你在不同的作用域(即两个函数)声明和访问该变量,它就会继续失败。如果你想在一个作用域中赋值它,并在另一个作用域中访问它,你将需要使它成为包装类的成员变量。

你的问题是误导,因为你不想为用户的输入分配一个enum,你想根据用户的输入选择合适的enum。

我为你提供了一个ideone中原始问题的简化案例,在那里你可以看到我所说的实际情况。

import java.util.Scanner;
class Player {
    private BaseClass playerClass;
    public void setPlayerClass() {
        Scanner in = new Scanner(System.in);
        StringBuilder output = new StringBuilder("Select a class:n");
        BaseClass[] classes = BaseClass.values();
        for (int i = 0, len = classes.length; i < len; i++) {
            output.append("t").append(i + 1).append(": ")
                  .append(classes[i].name()).append("n");
        }
        output.append(" >> ");
        System.out.print(output.toString());
        int playerChoice = in.nextInt();
        in.close();
        switch (playerChoice) {
            case 1:
                playerClass = BaseClass.Barbarian;
                break;
            case 2:
                playerClass = BaseClass.Cleric;
                break;
            case 3:
                playerClass = BaseClass.Mage;
                break;
            case 4:
                playerClass = BaseClass.Fighter;
                break;
        }
    }
    public BaseClass getPlayerClass() {
        return playerClass;
    }
    public static void main(String[] args) {
        Player p = new Player();
        p.setPlayerClass();
        System.out.println("Player selected: " + p.getPlayerClass().name());
    }
}
enum BaseClass {
    Barbarian, Cleric, Mage, Fighter;
}
http://ideone.com/IZNykB

注意:为了进一步说明,您必须注意在Java中作用域变量的位置。变量属于定义它的代码块的作用域。用大括号{}包装的代码块。由于您最初在交换机内部声明了Player_Class,因此它属于交换机的作用域,而不存在于交换机之外,因此访问它的方法没有返回您想要的结果。当你将Player_Class的声明从开关中移出,但仍然在setPlayerClass中,你所做的就是将其作用域扩展到整个函数setPlayerClass,但setPlayerClassgetPlayerClass不共享作用域,因此你仍然没有得到你想要的结果。

在我上面的例子中,我通过在Player类上使用一个名为playerClass的私有成员变量来解决这个问题,我可以从类中的多个点分配和返回,因为变量的作用域是我创建的Player类的实例。

这应该可以工作(不需要切换块):

Player_Class = Base_Class.values()[Base_Class_Choice - 1];

不能这样使用enum s。枚举是固定的、无状态的对象,你永远不会实例化它(这就是为什么它们的构造函数是私有的,因为编译器会为你做这件事)。

另外,顺便说一下,类名使用大写字母,字段和方法使用小写字母。另外,使用camelCase,而不是underscore_case——大多数Java程序员都是这样做的,这样做会让你更容易阅读别人的代码,也让别人更容易阅读你的代码。

我会把BaseClass放到一个单独的文件中,这样你就可以在任何地方使用它。然后只需使用方便的values()数组。我是这样做的:

BaseClass.java

public enum BaseClass {
    BAR ("Barbarian"), BRD ("Bard"), CLR ("Cleric"), DRU ("Druid"),
    FGT ("Fighter"), MON ("Monk"), PAL ("Paladin"), RAN ("Ranger"),
    ROG ("Rogue"), SOR ("Sorceror"), WIZ ("Wizard");
    private String fullName;
    private BaseClass(String fullName) { this.fullName = fullName; }
    public String getFullName() {
        return fullName;
    }
    // Here you can add other useful methods
};

Player.java

// snip
public void setBaseClass() {
    do {
        System.out.println("Available Classes: ");
        System.out.println("Please select a cooresponding number for class.");
        int i = 1;
        for(BaseClass value: BaseClass.values()){
            System.out.println(i+": "+value.name());
            i++;
        }
        try {
            int baseClassChoice = user_input.nextInt();
            if (i < 1 || i >= BaseClass.values()) {
                System.out.println("That is not a valid choice. Please try again");
                continue;
            }
            Player_Class = BaseClass.values()[i-1];
        } catch (Exception e) {
            System.out.println("You must choose a valid class. Try numbers.");
            user_input.next();
        }
    } while (Base_Class_Choice == 0);
}

您可以使用类似于下面的示例代码。它在我的环境中运行正常,你可以自己试试。

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
enum BaseClass {
    Barbarian(1), Bard(2), Cleric(3), Druid(4), Fighter(5), Monk(6), Paladin(7), Ranger(8), Rogue(9), Sorcerer(10), Wizard(11);
    private int numericValue;
    private static final Map<Integer, BaseClass> intToEnum = new HashMap<Integer, BaseClass>();
    static {
        for (BaseClass type : values()) {
            intToEnum.put(type.getNumericValue(), type);
        }
    }
    private BaseClass(int numericValue)
    {
        this.numericValue = numericValue;
    }
    public int getNumericValue()
    {
        return this.numericValue;
    }
    public static BaseClass fromInteger(int numericValue)
    {
        return intToEnum.get(numericValue);
    }
};
public class Game {
    public static void main(String[] args) throws IOException
    {
        Scanner input = new Scanner(System.in);
        BaseClass choice;
        do {
            System.out.println("Available Classes: ");
            System.out.println("Please select a cooresponding number for class.");
            for (Base_Class value : Base_Class.values()) {
                System.out.println(value.getNumericValue() + " : " + value);
            }
            choice = BaseClass.fromInteger(input.nextInt());
            if (choice == null) {
                System.out.println("Please select a valid class");
            }
        } while (choice == null);
        System.out.println("Successfully chosen: " + choice);
        input.close();
    }
}

最新更新