在Java中以递归方法外部化局部变量

时间:2014-10-24 15:22:26

标签: java recursion

我有一个递归方法,该方法包含本地String个变量:

private void recursiveUpdate(int id){
    String selectQuery="Select ...";
    String updateQuery="Update or rollback ..."

    ...

    for(int childID: children)
        recursiveUpdate(childID);
}

有没有理由外化本地String变量,如下所示:

private static final String selectQuery="Select ...";
private static final String updateQuery="Update or rollback ..."

private void recursiveUpdate(int id){
    ...

    for(int childID: children)
        recursiveUpdate(childID);
}

4 个答案:

答案 0 :(得分:1)

在前一种情况下,您依靠编译器来识别这些字符串在所有调用中是不变的,因此它不需要为每个recursiveUpdate调用提供每个变量的新副本,而在后一种情况下,毫无疑问。

答案 1 :(得分:1)

从技术角度来看,两者之间的差异应该可以忽略不计,因为在任何一种情况下,您总是使用相同的字符串实例。如果您在每个调用中解析这些查询,您也可以考虑将其外化(例如,使用预准备语句)。

从开发的角度来看,我可能会将查询外部化,以将它们与调用逻辑分开。

答案 2 :(得分:0)

是。你想要外化变量。如果保留为局部变量,amd取决于调用堆栈的大小,则可能会快速累积许多字符串对象并降低效率。如果在递归方法中对字符串进行编辑则更糟糕。此外,您不会对我看到的字符串进行更改,因此如果将其用作“参考”,最好将其外部化。

答案 3 :(得分:0)

通常,在进行递归调用时,您应该关注堆栈内存的大小。这告诉cpu方法完成时跳转的位置。它包含您的方法参数和返回位置。

在方法体内实例化的对象保存在堆中。在这种情况下,我认为编译器会发现这些是常量并将它们保存到静态内存中。当对象被实例化时,堆更大并且更有可能在递归中存活,所以我不担心它。通过移动对象,你将在堆中节省一点空间。

IMO,如果值始终相同(无动态),最好将变量移出。这样,如果他们改变了,你可以轻松找到它们。