我有一个递归方法,该方法包含本地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);
}
答案 0 :(得分:1)
在前一种情况下,您依靠编译器来识别这些字符串在所有调用中是不变的,因此它不需要为每个recursiveUpdate
调用提供每个变量的新副本,而在后一种情况下,毫无疑问。
答案 1 :(得分:1)
从技术角度来看,两者之间的差异应该可以忽略不计,因为在任何一种情况下,您总是使用相同的字符串实例。如果您在每个调用中解析这些查询,您也可以考虑将其外化(例如,使用预准备语句)。
从开发的角度来看,我可能会将查询外部化,以将它们与调用逻辑分开。
答案 2 :(得分:0)
是。你想要外化变量。如果保留为局部变量,amd取决于调用堆栈的大小,则可能会快速累积许多字符串对象并降低效率。如果在递归方法中对字符串进行编辑则更糟糕。此外,您不会对我看到的字符串进行更改,因此如果将其用作“参考”,最好将其外部化。
答案 3 :(得分:0)
通常,在进行递归调用时,您应该关注堆栈内存的大小。这告诉cpu方法完成时跳转的位置。它包含您的方法参数和返回位置。
在方法体内实例化的对象保存在堆中。在这种情况下,我认为编译器会发现这些是常量并将它们保存到静态内存中。当对象被实例化时,堆更大并且更有可能在递归中存活,所以我不担心它。通过移动对象,你将在堆中节省一点空间。
IMO,如果值始终相同(无动态),最好将变量移出。这样,如果他们改变了,你可以轻松找到它们。