我想知道他们是否是一个更聪明,更优雅的编写二传手的方式,或者就此而言,任何必须检查用户输入是否正确的代码
这看起来很奇怪。我是新手,所以也许这只是解决这个问题的标准方法,但如果没有,我会很高兴知道“聪明”的方式是什么
public void setMonth(){
boolean run = true;
while(run){
int input = scan.nextInt();
if(input > 0 && input < 13){
this.month = input;
run = false;
}
}
}
答案 0 :(得分:4)
首先,您可以像这样简化代码:
data Test.mydataset;
infile rawdata FirstObs=2;
Input Hire_data date9. empid$ Job_code $ Salary : dollar8.;
run;
除此之外,我将其分为两个功能。 setter只应设置一个值。
public void setMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
this.month = input;
}
根据ChiefTwoPencils的建议,您还可以将setter提取到另一个类中。从而进一步分离用户输入和数据。
public void setMonth(int month) {
if(month > 0 && month <= 12) {
this.month = month;
} else {
throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
}
}
public void readMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
setMonth(input);
}
答案 1 :(得分:1)
setter和getter也称为mutators和accessors。
我的理解是这些方法只用于检索或修改对象的“状态”。它不应该具有业务逻辑,或者尽可能少的业务逻辑。
基本上有廉价的计算/业务逻辑。
让你的setter只设置'值'。
public void setMonth(int month){
this.month = month
}
虽然基于输入检索值的方法可以在其他任何地方重用,我建议您可以创建一个实用程序类,并将其作为静态方法。
class DateUtil {
public static int retrieveMonthBasedOnInput(){
}
}
此类应具有从用户输入检索详细信息的业务逻辑,因此应在尝试设置该Bean实例的值时使用。
答案 2 :(得分:0)
该功能应该简单,只做一个工作。也许你可以像这样编码:
public void setMonth(int month) throws IllegalArgumentException {
if(month<0 || month>11) throw new IllegalArgumentException("Month can only be set 0~11");
this.month = month;
}
正如您所看到的,该函数只执行一个设置月份的事情。如果参数不正确,则抛出异常。
答案 3 :(得分:0)
写“好”的规则:
1)不要在setter中进行任何输入输出操作,如访问数据库,文件,网络,电子邮件发送,从命令行读取等...如果必须,请在调用setXXX之前或之后执行,最佳写作一些服务方法。
2)在setter中尽可能小的逻辑。可以像范围检查等那样进行参数验证......
3)Setter应该只做它设计的一件事(设定一个值),它不应该有任何副作用。