通常,set()方法可以在Java中返回一个值吗?

时间:2015-04-22 19:02:26

标签: java methods set return-value

我正在学习如何用Java编写整洁有序的代码。 set()方法可以返回一个值,还是有更有效/可读的方法呢?

public class Car {

     private boolean mHasAxles;
     private boolean mHasTires;
     private Tires mTires;

     public setAxels(boolean hasAxles) {
          mHasAxels = hasAxles;
     }

     public boolean hasAxles() {
          return mHasAxles;
     }

     public boolean setTires(Tires tires) {
          if(hasAxles()){
               mTires = tires;
               mHasTires = true;
               return true;      // Returns true if it was able to set tires
          }
      return false;  // Returns false because car did not have axels
                     // Therefore, tires could not be set
     }
}

在这个例子中,我的问题是关于setTires()方法。如果班级在设置轮胎时检查汽车是否有车轴,或者应该将逻辑留给使用Car的班级? setTires()方法是否应该被调用,因为它返回一个值?

3 个答案:

答案 0 :(得分:2)

严格地说 - 不, setter 通常会返回void。

话虽如此,如果您愿意,您可以自由地返回boolean - 约定经常被破坏(即使在内部java api中),方法签名(包括它的返回类型)应该激发感兴趣的开发人员导航在代码中查看确切返回boolean的原因。

为了更清楚,您可能希望使用不同的方法名称,例如setTiresIfAble(Tires tires),或者您也可以返回void并按以下方式抛出异常:

 public void setTires(Tires tires){
     if(!hasAxels()) {
         throw new IllegalStateException("no axels!");
     }
     mTires = tires;
     mHasTires = true;
 }

顺便提一下,mHasTires是重复的,您可以随时查看是否tires == null

最后,您可以避免使用java中的m或匈牙利符号(按照惯例),如下所示:

 public setAxels(boolean hasAxels){
      this.hasAxels = hasAxels;
 }

答案 1 :(得分:1)

setSomething方法不应该返回任何内容

trySetSomething必须返回一个布尔值,表示该集合是否成功。

为什么?当你书面方式一些代码,在Java,C ++中,在任何langage,你希望你的代码,这可能是一个人的任何读者,请可以访问到的大部分东西的方法做knownledge,只是读他的名字。

要完成此断言,我们可以研究set可能失败的情况。处理故障有两种可能性,具体取决于方法的范围:

  1. 如果setSomething的范围是受保护私有,则表示您拥有控制权,作为API开发者,在它被调用的方式上。可以使用断言或RuntimeException来管理可能的失败(因为在方法签名中声明throws子句不是必需的。)

  2. 如果setSomething的范围公开,则意味着您无法控制其作为API开发者的控制方式。您必须警告API的用户setSomething不是错误安全的。您必须使用必须在throw子句中声明的异常来管理可能的失败。

答案 2 :(得分:0)

你"可以"返回一个值,但按照惯例,setters不会返回一个值。由于setter通常以一种甚至不引用返回值的方式使用,因此类的任何调用者都很容易忽略您返回的值。什么都没有阻止被叫做:

myCar.setTires(aTire);

...并且忽略你甚至返回一个布尔值,因为这是调用和使用setter的正常方式。如果调用者可以忽略它并且代码看起来正确,那么这就失去了返回值的目的。

我的第一个倾向是抛出java.lang.IllegalArgumentException而不是返回false。