我正在学习如何用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()
方法是否应该被调用,因为它返回一个值?
答案 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
可能失败的情况。处理故障有两种可能性,具体取决于方法的范围:
如果setSomething
的范围是受保护,私有或包,则表示您拥有控制权,作为API开发者,在它被调用的方式上。可以使用断言或RuntimeException
来管理可能的失败(因为在方法签名中声明throws
子句不是必需的。)
如果setSomething
的范围公开,则意味着您无法控制其作为API开发者的控制方式。您必须警告API的用户setSomething
不是错误安全的。您必须使用必须在throw
子句中声明的异常来管理可能的失败。
答案 2 :(得分:0)
你"可以"返回一个值,但按照惯例,setters不会返回一个值。由于setter通常以一种甚至不引用返回值的方式使用,因此类的任何调用者都很容易忽略您返回的值。什么都没有阻止被叫做:
myCar.setTires(aTire);
...并且忽略你甚至返回一个布尔值,因为这是调用和使用setter的正常方式。如果调用者可以忽略它并且代码看起来正确,那么这就失去了返回值的目的。
我的第一个倾向是抛出java.lang.IllegalArgumentException而不是返回false。