我试图创建一个方法,通过该方法我可以返回由用户输入设置的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
,但setPlayerClass
和getPlayerClass
不共享作用域,因此你仍然没有得到你想要的结果。
在我上面的例子中,我通过在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();
}
}