Java 方法中的变量应在何处定义?

Java 方法中的变量应在何处定义?,java,Java,假设我有一个参数为Objecttype的方法。 该方法不返回任何内容-void 首先,它检查参数是否为null(或任何其他检查,如objectParam.isEnabled()) 现在,如果条件满足,我需要局部变量。如果不是,那么我不需要任何变量 我应该在哪里定义它们?在“if作用域”内还是在方法头之后 当然,我可以在任何我喜欢的地方做它,但是哪种方式应该是更好的实践?我认为最好的实践是尽可能晚地声明变量,在嵌套最紧密的范围内,最好是在用有用的值初始化变量的时候 这使得它在何处以及如何使用变得更

假设我有一个参数为
Object
type的方法。 该方法不返回任何内容-
void

首先,它检查参数是否为null(或任何其他检查,如
objectParam.isEnabled()

现在,如果条件满足,我需要局部变量。如果不是,那么我不需要任何变量

我应该在哪里定义它们?在“if作用域”内还是在方法头之后


当然,我可以在任何我喜欢的地方做它,但是哪种方式应该是更好的实践?

我认为最好的实践是尽可能晚地声明变量,在嵌套最紧密的范围内,最好是在用有用的值初始化变量的时候

这使得它在何处以及如何使用变得更加清晰——当您查看使用它的代码时,您不必查找太远就可以看到声明

在这种情况下,我不同意官方的Java风格指南,Josh Bloch也是如此。摘自《有效Java》,第二版,第45项:

使局部变量的作用域最小化的最强大的技术是在第一次使用它的地方声明它


因此,如果您在执行其他一些语句之前不需要变量,那么在执行这些语句之前不要声明它。

我认为最好尽可能晚地在嵌套最紧密的范围内声明变量,最好是在使用有用的值初始化变量时

这使得它在何处以及如何使用变得更加清晰——当您查看使用它的代码时,您不必查找太远就可以看到声明

在这种情况下,我不同意官方的Java风格指南,Josh Bloch也是如此。摘自《有效Java》,第二版,第45项:

使局部变量的作用域最小化的最强大的技术是在第一次使用它的地方声明它


因此,如果在执行其他一些语句之前不需要该变量,则在此之前不要声明它。

如果它们仅在

if (...) { }
块,则应在该块的顶部声明它们


如果仅在中使用,则具有更多详细信息。

if (...) { }
块,则应在该块的顶部声明它们


具有更多详细信息。

您应该在使用它们的最窄范围内初始化它们,因此在本例中,在
if
块内初始化它们

void foo(Object obj){
    if (obj != null) {
        int a = 0;
        ...
    } 
}

如果它们不打算在这个块之外的任何地方使用,那么就没有必要把方法弄得乱七八糟,把代码的读取器与在它们所需范围之外声明的额外变量混淆起来。

您应该在使用它们的最窄范围内初始化它们,在这种情况下,在
If
块内初始化它们

void foo(Object obj){
    if (obj != null) {
        int a = 0;
        ...
    } 
}

如果它们不打算在这个块之外的任何地方使用,那么就没有必要把方法弄得乱七八糟,把代码的读者和声明在其所需范围之外的额外变量混淆起来。

@Jon Skeet。然后我有一个问题。您写道:“理想情况下,在使用有用的值初始化时。”如果我有一个循环会怎么样。如果它从未执行过(例如,列表中没有元素),我将不需要任何变量。(但是!在我想处理的结构中至少有一个元素的情况下,我肯定需要它们)。如果我将它们声明在循环范围之外,我将不会听从您的建议。如果我在循环中声明它们,它们将在每次迭代中重新声明。可以吗?也许JVM优化了代码,这不是问题吗?如果它们只在循环中需要,你应该在循环中声明它们,除非有很好的理由不这样做-例如,你真的只需要初始化一次,而且初始化很昂贵。请注意,仅在循环中声明变量不会造成运行时性能损失。是否不会造成运行时损失?有趣。所以你的意思是这样编程更好:while(rs.hasNext()){String name=rs.getString(“name”);String name=rs.getString(“surn”);//对那些本地变量做点什么//……}而不是像这样:String name,姓氏;虽然(rs.hasNext()){name=rs.getString(“name”);name=rs.getString(“surn”);//对那些本地变量做点什么//……}?当然-第一种方法更好,速度也一样快。@Jon Skeet。然后我有一个问题。您写道:“理想情况下,在使用有用的值初始化时。”如果我有一个循环会怎么样。如果它从未执行过(例如,列表中没有元素),我将不需要任何变量。(但是!在我想处理的结构中至少有一个元素的情况下,我肯定需要它们)。如果我将它们声明在循环范围之外,我将不会听从您的建议。如果我在循环中声明它们,它们将在每次迭代中重新声明。可以吗?也许JVM优化了代码,这不是问题吗?如果它们只在循环中需要,你应该在循环中声明它们,除非有很好的理由不这样做-例如,你真的只需要初始化一次,而且初始化很昂贵。请注意,仅在循环中声明变量不会造成运行时性能损失。是否不会造成运行时损失?有趣。所以你的意思是这样编程更好:while(rs.hasNext()){String name=rs.getString(“name”);String name=rs.getString(“surn”);//对那些本地变量做点什么//……}而不是像这样:String name,姓氏;虽然(rs.hasNext()){name=rs.getString(“name”);name=rs.getString(“surn”);//对那些本地变量做些什么//……}?当然-第一种方法更好,速度也一样快。