我想知道是否他们是一个更聪明和更优雅的方式来编写setter,或者对于这件事,任何代码必须检查用户输入是否正确
这看起来很奇怪。我是一个新手,所以这可能只是解决这个问题的标准方法,但如果不是,我希望知道什么是"聪明"的方法
public void setMonth(){
boolean run = true;
while(run){
int input = scan.nextInt();
if(input > 0 && input < 13){
this.month = input;
run = false;
}
}
}
首先你可以像这样简化你的代码:
public void setMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
this.month = input;
}
除此之外,我将它分成两个函数。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);
}
正如ChiefTwoPencils所建议的,你可以进一步将setter提取到一个额外的类中。从而进一步分离用户输入和数据。
class MonthDataHolder {
private int month;
public MonthDataHolder(int month) {
setMonth(month);
}
public void setMonth(int month) {
if(isValidMonthValue(month)) {
this.month = month;
} else {
throw new IllegalArgumentException("Month has to be a value between 1 and 12 inclusively. Actual value was :" + month);
}
}
private boolean isValidMonthValue(month) {
return month >= 1 || month <= 12;
}
}
class InputReader {
public MonthDataHolder readMonth() {
int input = 0;
do {
input = scan.nextInt();
} while(input <= 0 || input >= 13)
return new MonthDataHolder(input);
}
}
setter和getter也称为mutator和accessor。
我的理解是,这些方法只是在那里检索或修改对象的"状态"。它不应该包含业务逻辑,或者尽可能少地包含业务逻辑。
基本上有便宜的计算/业务逻辑。
让你的setter只'set'值。
public void setMonth(int month){
this.month = month
}
而基于输入检索值的方法可以在其他任何地方重用,我建议您可以创建一个实用程序类,并将其作为静态方法。
class DateUtil {
public static int retrieveMonthBasedOnInput(){
}
}
该类应该具有从用户输入中检索详细信息的业务逻辑,因此应该在尝试设置该bean实例的值时使用。
"good"的书写规则:
1)不要在setter中做任何输入输出操作,如访问数据库、文件、网络、发送电子邮件、从命令行读取等…如果必须,在调用setXXX之前或之后执行,最好为此编写一些服务方法。
2) setter中的逻辑尽可能小。可以进行参数验证,如范围检查等…
函数应该是简单的,只做一个工作。也许你可以这样写:
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;
}
可以看到,该函数只做一件事,即设置月份。如果参数不正确,则抛出异常。