我从遗留系统中遇到了2个代码示例,我无法理解为什么有人会像这样编码。该应用程序是Java,大约10-15岁。
这样做难以理解似乎效率低下。
function numericObjectWalk(obj, func, context){
var a = [], c = context || this;
for(var i in obj){
a.push(+i);
}
a.sort(function(a, b){
return a-b;
});
for(var i=0,v,l=a.length; i<l; i++){
v = a[i]; func.call(c, v, obj[v]);
}
return obj;
}
numericObjectWalk(yourObject, function(prop, obj){
if(prop === 341){
obj.name = 'new name';
}
});
我不明白你为什么不首先将它分配给属性?由于hdtTmp和hddTmp在块内,为什么要将它们设为null?
if(condition) {
String[] hdtTmp = { "Range (Brand):", "Build Region:", "Design:", "Plan (Size):", "Facade:", "Region:" , "Internal Colour", "External Colour"};
hdt = hdtTmp;
String[] hddTmp = { p.RangeName, brName, p.HomeName, p.Name, f.Name, "North", "Red", "Blue"};
hdd = hddTmp;
hddTmp = null;
hdtTmp = null;
}
同样,原来程序员似乎不知道循环是如何工作的?
当我攻读学位时,他们从未教过这个,所以我的问题是,为什么有人会写这样的代码?
答案 0 :(得分:0)
将局部变量设置为null ...早在90年代,一些旧的Sun文档建议这会有所帮助,但它已经很长时间了,而且信息可能不再可用,因为它不再正确。我已经在很多旧代码中遇到过这个问题,并且在这一点上它没有做任何事情,因为一旦方法退出并且GC足够聪明地解决了这个问题,局部变量就会松散对象的引用。
for()循环问题更多的是在实际循环内构建具有退出条件的循环的人。这只是不幸的编码风格,可能是由一个相对较低级的开发人员编写的。
这段代码看起来像是在学习C / C ++之后编写java的人。我已经看到了足够多的东西,C / C ++人员被教导在分配后进行清理并且分配给null是让他们感到高兴的事情(至少那些我在当天工作过的人)。他们做的另一件事是覆盖finalize方法,这在java中是不好的形式,但是它们是最接近析构函数的东西。
您可能还会看到内部停止条件的无限循环,如:
for (;;) {
// Do stuff
if (something_happened)
break;
}
旧(坏)的习惯很难消失。
答案 1 :(得分:0)
在一般情况下,存在一个用于归零变量的狭义用例。
如果分配null
和变量范围的结尾(通常是方法的结尾)之间的代码长时间运行,则归零为GC提供了之前引用的对象的早期机会。
从表面上看,这是一个微优化,但它可以带来安全性好处:如果发生内存转储或其他类似快照(例如,通过分析器),它可以(非常轻微地)减少敏感数据部分的可能性转储。
这些“好处”虽然很脆弱。
然而,问题中的代码完全没用。