奇怪的编码方法在java中

时间:2016-10-13 00:54:38

标签: java legacy

我从遗留系统中遇到了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;
}

同样,原来程序员似乎不知道循环是如何工作的?

当我攻读学位时,他们从未教过这个,所以我的问题是,为什么有人会写这样的代码?

2 个答案:

答案 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提供了之前引用的对象的早期机会。

从表面上看,这是一个微优化,但它可以带来安全性好处:如果发生内存转储或其他类似快照(例如,通过分析器),它可以(非常轻微地)减少敏感数据部分的可能性转储。

这些“好处”虽然很脆弱。

然而,问题中的代码完全没用。