可能看起来像个愚蠢的问题。我只是想知道哪种是更好的编码方式。
选项1:
if(a==null) {
a=getA();
return a;
} else {
return a;
}
选项2:
if(a==null) {
a=getA();
}
return a;
变量a是一个静态变量,用于缓存getA()并避免多次调用它。
答案 0 :(得分:6)
还有一个更短的第三种选择 - 使用三元条件运算符:
return a != null ? a : getA();
编辑:我认为a
是一个局部变量,因此如果它是null
则不必分配。另一方面,如果它是用作缓存的实例变量(以避免多次调用getA()
),则需要将getA()
的结果分配给a
,在这种情况下我会使用你的第二个选择,因为它更短,更清晰(你仍然可以使用带有赋值的三元条件运算符 - return a != null ? a : (a = getA());
- 但我发现它不那么明确了。)
答案 1 :(得分:1)
我更喜欢第二种选择,因为只有一个return
语句,这可以帮助调试(你只需要放入一个断点而不是两个断点)。你也可以在第一选择中复制代码。
但在这种情况下,我更喜欢使用三元条件:
return a == null ? getA() : a;
答案 2 :(得分:1)
我更喜欢第二种选择,最佳做法是在方法中只有一个return语句。这将是更易读的代码。
答案 3 :(得分:0)
第二个更简洁,因此可能更好,但这是一个主观问题,没有人可以给你一个特别客观的答案。无论您喜欢什么或适合您的团队编码标准都是答案。
正如已经指出的那样,有一种更短的方法:
return a!=null ? a : getA();
但同样,这完全取决于您和您的团队喜欢什么。我个人更喜欢你展示的第二种方式,因为它更具可读性(在我看来)。
答案 4 :(得分:0)
我假设a
是一个类成员,而getA()
是一个创建a
实例的方法。
最好的解决方案应该是在被调用的方法中推送这个逻辑。换句话说,而不是:
void someFunction() {
// logic
if(a==null) {
a=getA();
}
return a;
}
A getA() {
// creation logic of instance A
return newAInstance;
}
你应该:
void someFunction() {
// logic
return getA();
}
A getA() {
if(a == null) {
// creation logic of instance A
}
return a;
}
方法调用的成本很低,并且在实例化 a
时无需处理。