Return java 中的语句最佳实践?
Return statement best practices in java?
我想知道这两个代码之间的区别,即使它们产生相同的输出:
代码 1:
class ret {
public static int add(int x) {
if(x!=0)
return x+add(x-1);
return x;
}
public static void main(String args[]) {
System.out.println(add(5));
}
}
代码 2:
class ret {
public static int add(int x) {
if(x!=0)
return x+add(x-1);
return 0;
}
public static void main(String args[]) {
System.out.println(add(5));
}
}
他们都输出 15 但为什么第二个代码也输出 15 而不是零?我的理解是代码 2 的最后一次调用将是 add(0) 并且它将 return zero.I 还想知道是否可以使用多个 return 语句或使用单个 return 语句并将其余部分替换为本地 variables.I 记得阅读单入口单出口模型是一个很好的做法.
这是一个递归方法,所以当x != 0
时,您将return“x
的结果添加到使用(x-1)
再次调用该方法”。最终调用将始终 return x == 0
或 constant = 0
,因此您将从两个版本中 return 15
。
单个 return 与多个 return 是一个有争议的问题。通常应首选前者。一般来说,多个 return 语句在何处是可以接受的是显而易见的,因为使用它们比使用设计单个出口点所需的替代代码结构更容易理解该方法。另请注意,您可以将 add
重写为:
public static int add(int x) {
return x == 0 ? 0 : (x + add(x-1));
}
版本 1:
add(5)
call add(4)
call add(3)
call add(2)
call add(1)
call add(0)
return (x = 0)
return (x = 1) + (add(x-1) = 0) = 1
return (x = 2) + (add(x-1) = 1) = 3
return (x = 3) + (add(x-1) = 3) = 6
return (x = 4) + (add(x-1) = 6) = 10
return (x = 5) + (add(x-1) = 10) = 15
版本 2:
add(5)
call add(4)
call add(3)
call add(2)
call add(1)
call add(0)
return (constant = 0) // the only difference
return (x = 1) + (add(x-1) = 0) = 1
return (x = 2) + (add(x-1) = 1) = 3
return (x = 3) + (add(x-1) = 3) = 6
return (x = 4) + (add(x-1) = 6) = 10
return (x = 5) + (add(x-1) = 10) = 15
使用多个 return
语句与使用单个出口点无法用简单的一行答案来回答。我猜你能得到的最佳答案是 "it depends on your company's standards".
单一出口点是一个很好的标准,尽管我个人并不赞同。您最终得到的方法在末尾始终只有一个 return
语句,因此您永远不会在编辑其他人的代码时寻找许多可能的 return
语句。我相信过去使用 C 编写代码的开发人员倾向于遵循此标准(参见此 question)。
我个人更喜欢使用多个 return
语句,因为它可以帮助简化代码。我喜欢使用它的一种情况是防止在我的代码中使用级联大括号。例如,在以下示例中:
private int doSomething (int param) {
int returnCode;
if (param >= 0) {
int someValue = param * CONSTANT_VALUE;
if (isWithinExpectedRange (someValue)) {
if (updateSomething (someValue)) {
returnCode = 0;
} else {
returnCode = -3;
}
} else {
returnCode = -2;
}
} else {
returnCode = -1;
}
return returnCode;
}
我发现这种类型的编码在阅读时非常混乱。我倾向于将此类代码更改为:
private int doSomething (int param) {
if (param < 0) {
return -1;
}
int someValue = param * CONSTANT_VALUE;
if (!isWithinExpectedRange (someValue)) {
return -2;
}
if (!updateSomething (someValue)) {
return -3;
}
return 0;
}
对我来说,第二个示例看起来更干净、更清晰。当实际代码在 else
块中有一些额外编码时甚至更多。
同样,这是个人品味。有些公司可能会强制执行单一出口点,有些可能不会,而有些开发人员更喜欢单一出口点。底线是,如果在您的环境中有可供您遵循的指南,那么就照做。如果没有,那么你可以部分地根据这些参数选择你自己的偏好。
我想知道这两个代码之间的区别,即使它们产生相同的输出:
代码 1:
class ret {
public static int add(int x) {
if(x!=0)
return x+add(x-1);
return x;
}
public static void main(String args[]) {
System.out.println(add(5));
}
}
代码 2:
class ret {
public static int add(int x) {
if(x!=0)
return x+add(x-1);
return 0;
}
public static void main(String args[]) {
System.out.println(add(5));
}
}
他们都输出 15 但为什么第二个代码也输出 15 而不是零?我的理解是代码 2 的最后一次调用将是 add(0) 并且它将 return zero.I 还想知道是否可以使用多个 return 语句或使用单个 return 语句并将其余部分替换为本地 variables.I 记得阅读单入口单出口模型是一个很好的做法.
这是一个递归方法,所以当x != 0
时,您将return“x
的结果添加到使用(x-1)
再次调用该方法”。最终调用将始终 return x == 0
或 constant = 0
,因此您将从两个版本中 return 15
。
单个 return 与多个 return 是一个有争议的问题。通常应首选前者。一般来说,多个 return 语句在何处是可以接受的是显而易见的,因为使用它们比使用设计单个出口点所需的替代代码结构更容易理解该方法。另请注意,您可以将 add
重写为:
public static int add(int x) {
return x == 0 ? 0 : (x + add(x-1));
}
版本 1:
add(5)
call add(4)
call add(3)
call add(2)
call add(1)
call add(0)
return (x = 0)
return (x = 1) + (add(x-1) = 0) = 1
return (x = 2) + (add(x-1) = 1) = 3
return (x = 3) + (add(x-1) = 3) = 6
return (x = 4) + (add(x-1) = 6) = 10
return (x = 5) + (add(x-1) = 10) = 15
版本 2:
add(5)
call add(4)
call add(3)
call add(2)
call add(1)
call add(0)
return (constant = 0) // the only difference
return (x = 1) + (add(x-1) = 0) = 1
return (x = 2) + (add(x-1) = 1) = 3
return (x = 3) + (add(x-1) = 3) = 6
return (x = 4) + (add(x-1) = 6) = 10
return (x = 5) + (add(x-1) = 10) = 15
使用多个 return
语句与使用单个出口点无法用简单的一行答案来回答。我猜你能得到的最佳答案是 "it depends on your company's standards".
单一出口点是一个很好的标准,尽管我个人并不赞同。您最终得到的方法在末尾始终只有一个 return
语句,因此您永远不会在编辑其他人的代码时寻找许多可能的 return
语句。我相信过去使用 C 编写代码的开发人员倾向于遵循此标准(参见此 question)。
我个人更喜欢使用多个 return
语句,因为它可以帮助简化代码。我喜欢使用它的一种情况是防止在我的代码中使用级联大括号。例如,在以下示例中:
private int doSomething (int param) {
int returnCode;
if (param >= 0) {
int someValue = param * CONSTANT_VALUE;
if (isWithinExpectedRange (someValue)) {
if (updateSomething (someValue)) {
returnCode = 0;
} else {
returnCode = -3;
}
} else {
returnCode = -2;
}
} else {
returnCode = -1;
}
return returnCode;
}
我发现这种类型的编码在阅读时非常混乱。我倾向于将此类代码更改为:
private int doSomething (int param) {
if (param < 0) {
return -1;
}
int someValue = param * CONSTANT_VALUE;
if (!isWithinExpectedRange (someValue)) {
return -2;
}
if (!updateSomething (someValue)) {
return -3;
}
return 0;
}
对我来说,第二个示例看起来更干净、更清晰。当实际代码在 else
块中有一些额外编码时甚至更多。
同样,这是个人品味。有些公司可能会强制执行单一出口点,有些可能不会,而有些开发人员更喜欢单一出口点。底线是,如果在您的环境中有可供您遵循的指南,那么就照做。如果没有,那么你可以部分地根据这些参数选择你自己的偏好。