更优雅的Setter编程方法



我想知道是否他们是一个更聪明和更优雅的方式来编写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中的逻辑尽可能小。可以进行参数验证,如范围检查等…

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;
}

可以看到,该函数只做一件事,即设置月份。如果参数不正确,则抛出异常。

相关内容

  • 没有找到相关文章

最新更新