按照惯例,set() 方法可以 return 中的值 Java 吗?

Conventionally, can a set() method return a value in Java?

我正在学习如何在 Java 中编写整洁有序的代码。 set() 方法可以 return 一个值还是有更多 efficient/readable 方法来做到这一点?

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() 方法。 class 应该在设置轮胎时检查汽车是否有车轴,还是应该将逻辑留给使用 Car 的 class? setTires() 方法是否应该被称为其他东西,因为它 return 是一个值?

严格按照惯例 - 不,setter 通常 return 无效。

话虽如此,如果您愿意,您可以自由 return boolean - 惯例经常被打破(即使在内部 java api's)并且方法签名,包括它的 return 类型,应该会激发感兴趣的开发人员浏览代码以确切了解为什么 boolean 是 returned.

为了更清楚,您可能想使用不同的方法名称,例如setTiresIfAble(Tires tires),或者您也可以 return 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;
 }

您 "can" return 一个值,但按照惯例设置器不 return 一个值。由于设置器通常以一种甚至不引用 return 值的方式使用,因此 class 的任何调用者很容易忽略您正在 return 值。没有什么能阻止被调用者做的事情:

myCar.setTires(轮胎);

...甚至忽略你 return 一个布尔值,因为这是调用和使用设置器的正常方式。如果调用者可以忽略它并且代码看起来正确,那么这就违背了 returning 值的目的。

我的第一反应是抛出一个 java.lang.IllegalArgumentException 而不是 return false。

一个setSomething方法不应该return任何东西

A trySetSomething必须 return 一个布尔值,表示设置是否成功。

为什么?当您用 Java、C++、任何语言编写代码时,您希望代码中的任何 reader(可能是人类) 可以访问了解一个方法的大部分功能,只需阅读他的名字即可。

为了完成这个断言,我们可以研究 set 可能失败的情况。根据方法的范围,有两种可能的方法来处理失败:

  1. 如果 setSomething 的范围是 protectedprivatepackage ,这意味着作为 API 开发者,您可以控制调用它的方式。可以使用断言或 RuntimeException 来管理可能的失败(因为不必在方法签名中声明 throws 子句)。

  2. 如果setSomething的范围是public,说明你没有控制权,如API 开发人员,在途中将被调用。您必须警告 API 的用户 setSomething 不是错误安全的。您必须使用必须在 throw 子句中声明的异常来管理可能的失败。