按照惯例,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
可能失败的情况。根据方法的范围,有两种可能的方法来处理失败:
如果 setSomething
的范围是 protected、private 或 package ,这意味着作为 API 开发者,您可以控制调用它的方式。可以使用断言或 RuntimeException
来管理可能的失败(因为不必在方法签名中声明 throws
子句)。
如果setSomething
的范围是public,说明你没有控制权,如API 开发人员,在途中将被调用。您必须警告 API 的用户 setSomething
不是错误安全的。您必须使用必须在 throw
子句中声明的异常来管理可能的失败。
我正在学习如何在 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
可能失败的情况。根据方法的范围,有两种可能的方法来处理失败:
如果
setSomething
的范围是 protected、private 或 package ,这意味着作为 API 开发者,您可以控制调用它的方式。可以使用断言或RuntimeException
来管理可能的失败(因为不必在方法签名中声明throws
子句)。如果
setSomething
的范围是public,说明你没有控制权,如API 开发人员,在途中将被调用。您必须警告 API 的用户setSomething
不是错误安全的。您必须使用必须在throw
子句中声明的异常来管理可能的失败。