gpt4 book ai didi

java - 如何使用 Java 中同一类中的另一个 setter 为 setter 赋值

转载 作者:行者123 更新时间:2023-12-01 12:39:52 25 4
gpt4 key购买 nike

我是编程新手,我正在制作一个基于文本的游戏;更具体地说,是玩家的创造。它会要求您声明该人的姓名、性别和类型(青少年、青年、成人或老年人),并且会根据玩家类型给出该人的年龄,例如青少年可能是 13-17 岁。为此,我询问用户类型是什么,这将是 setPlayerType 的值。然后,setAge 假设使用来自 setPersonType 的信息来使用 if 语句来决定年龄应该是多少。为了测试程序以查看玩家创建系统是否正常工作,我让它打印出玩家的姓名、年龄和性别。然而,它总是打印年龄为0,我已经尝试修复它近一个小时了。抱歉,如果我没有使用正确的命名约定,我仍在尝试掌握 setter 和 getter 的窍门。我希望我解释得足够好,让你们能够理解我想要做什么。提前非常感谢您!

这是我的测试人员类(class):

import javax.swing.JOptionPane;

public class PopulationGameTestDrive {

static Person one = new Person();



public static void main(String[] args){

one.setName(JOptionPane.showInputDialog("Name your player"));
one.setGender(JOptionPane.showInputDialog("What is their gender?"));
one.setPersonType(JOptionPane.showInputDialog("Are they a teen, young adult, adult, or elder?"));

String testName = one.getName();
String testGender = one.getGender();
int testAge = one.getAge();

System.out.println(testName + " is " + testAge + " and is a " + testGender);

}

}

这是 Player 类:

import java.util.Random;

public class Person {

private String name; //they choose a name
private String gender; //male or female
private String personsType; //teen, young adult, adult, or elder
int numOfKids = 0;
private int age;

public String getName(){
return name;
}

public void setName(String personsName){
name = personsName;
}

public String getPersonType(){
return personsType;
}

/*
* setPersonType gives age a value based on whether
* the player chose teen, young adult, adult, or elder
*/
public void setPersonType(String personType){
personsType = personType;
}



public String getGender(){
return gender;
}

public void setGender(String personsGender){
gender = personsGender;
}

public int getAge(){
return age;
}

public void setAge(int personsAge){
if(personsType.equals("teen")){
Random num = new Random();
int number = num.nextInt(20);
if(number > 12 & number < 18){
age = number;
} else if(personsType.equals("young adult")){
Random num2 = new Random();
int number2 = num2.nextInt(30);
if(number2 > 17 & number2 < 31){
age = number2;
} else if(personsType.equals("adult")){
Random num3 = new Random();
int number3 = num3.nextInt(50);
if(number3 > 30 & number3 < 50){
age = number3;
}else if(personsType.equals("elder")){
Random num4 = new Random();
int number4 = num4.nextInt(100);
if(number4 > 49 & number4 < 101){
age = number4;
}
}
}
}
}
age = personsAge;
}

}

最佳答案

Mshnik 是正确的,您的测试类实际上从未调用 setAge(int),并且很好地指出了字符串在用一组有限的可接受值表示数据时容易出错。但是,即使您在测试类中调用 setAge() 甚至将 personType 转换为枚举,您的 setter 中也会存在一些其他正确性和稳健性问题。既然你提到仍在尝试掌握它们,我想借此机会提及在出现不同的意外行为之前我突然想到的事情。

当您有将对象作为参数的 setter 时,您必须始终确保它们以可接受的方式处理参数 null。

就您的代码而言,如果用户关闭任何输入对话框,则调用 equals() 时将引发 NullPointerException,并且在您开发游戏时,堆栈跟踪的调试将变得不必要的复杂。您应该决定每个字段是否可以合理地设置为 null,如果不能,则让 setter 抛出 IllegalArgumentException 并在调用 setter 的代码中适当处理它。

其次,考虑用户是否输入“TEEN”作为年龄段。您的代码不会按预期将年龄设置为青少年范围内的随机值,它将年龄设置为传递给 setAge() 的值,我假设这是默认值,可能与它们的类型没有合理的关系。将用户输入的字符串与存储的值进行比较时,使用 equalsIgnoreCase() 是更好的做法。

第三,在人口游戏中,随着时间的推移,年龄初始化后,setAge() 是否会被调用,这就是 int 参数的目的吗?如果是这样,您仍然会得到意想不到的结果,例如青少年玩家为 15 岁,调用 setAge(16),而变量实际上被设置为 14。

我对如何避免这个问题的理解有两种途径之一。您可以将 setAge(int) 的实现更改为仅在之前未初始化年龄时使用随机值,否则将年龄设置为其参数。例如,调用 setAge 的逻辑还需要确保当青少年满二十岁时更新类型。

这要求 setter 执行至少两项单独的工作,因此我的要求不高,当您修改测试时,亲自重载 setAge 会很有值(value)。我将使用一个带有整数参数的参数来检查合理的参数值,然后设置变量,以及一个带有 AgeBracket 枚举参数的参数,该参数使用现有的实现将变量设置为括号内的随机 int 值。

关于java - 如何使用 Java 中同一类中的另一个 setter 为 setter 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25215012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com