代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

这些PMD规则的原因是什么?

  •  34
  • Thomas Owens  · 技术社区  · 15 年前

    数据流异常分析:找到 “dd”-变量“variable”的异常 (行“n1”-“n2”)。

    数据流异常分析:找到 “du”-变量“variable”的异常 (行“n1”-“n2”)。

    dd和du听起来很熟悉……我想在测试和分析中说一些与最弱的前后条件有关的事情,但我不记得具体的细节。

    空赋值:将对象赋值给 空是一种代码气味。考虑 重构。

    不会将对象设置为 null 如果对象是本地对象(未在方法外部使用),则有助于垃圾收集?还是神话?

    methodArgumentCouldBefinal:参数 “param”未分配,可以是 宣布最终

    localvariableCouldBefinal:本地 变量“variable”可以声明 最终的

    使用有什么好处吗 final 参数和变量?

    松耦合:避免使用 实现类型如 'LinkedList';使用接口 相反

    如果我知道我特别需要 LinkedList ,为什么我不使用它向未来的开发人员明确说明我的意图?返回类路径中最高的类是一回事,但为什么我不声明我的变量是最严格的呢?

    AvoidSynchronizedMethodLevel:使用 块级而不是方法级 同步

    块级同步比方法级同步有什么优势?

    avoidusingshorttype:不要使用 短型

    我的第一语言是C语言和C++语言,但是在Java世界中,为什么我不应该使用最能描述我的数据的类型呢?

    6 回复  |  直到 9 年前
        1
  •  33
  •   Community Egal    7 年前
    • dd和du异常(如果我没记错的话——我使用findbugs,消息有点不同)是指将一个值赋给一个从未被读取的局部变量,通常是因为它在被读取之前被重新分配了另一个值。典型的情况是用 null 当它被宣布的时候。 Don't declare the variable until it's needed.

    • 指派 无效的 对于一个局部变量来说,为了“帮助”垃圾收集器是一个神话。PMD让你知道这只是反生产的混乱。

    • 在局部变量上指定final 应该 对优化器非常有用,但我没有任何当前jit利用这一提示的具体例子。我发现它对我自己的代码正确性的推理很有用。

    • 用…来指定接口 界面 是一个伟大的设计实践。在不影响调用方的情况下,您可以轻松地更改集合的实现。接口就是这样的。

    • 我想不出许多来电者会想到的情况。 要求 LinkedList ,因为它不公开任何未由某个接口声明的api。如果客户机依赖于该api,则可以通过正确的接口使用它。

    • 块级同步允许关键部分更小,从而允许尽可能多的工作同时完成。也许更重要的是,它允许使用由封闭对象私人控制的锁对象。这样,您就可以保证不会发生死锁。使用实例本身作为一个锁,任何人都可以错误地同步它,从而导致死锁。

    • 类型的操作数 short 被提升到 int 在任何行动中。这条规则是让您知道正在进行此升级,您还可以使用 int . 但是,使用 短的 类型可以节省内存,所以如果它是实例成员,我可能会忽略该规则。

        2
  •  3
  •   OscarRyz    15 年前

    数据流异常分析:找到 “dd”-变量“variable”的异常 (行“n1”-“n2”)。

    数据流异常分析:找到 “du”-变量“variable”的异常 (行“n1”-“n2”)。

    不知道。

    空赋值:将对象赋值给 空是一种代码气味。考虑 重构。

    不会将对象设置为 null 如果对象是本地对象(未在方法外部使用),则有助于垃圾收集?还是神话?

    一旦方法返回,本地方法中的对象就被标记为垃圾回收。将它们设置为空不会有任何区别。

    因为这会使开发人员缺乏经验,所以空赋值可能被认为是一种代码味道。

    methodArgumentCouldBefinal:参数 “param”未分配,可以是 宣布最终

    localvariableCouldBefinal:本地 变量“variable”可以声明 最终的

    使用有什么好处吗 final 参数和变量?

    更清楚的是,在对象的生命周期中,值不会改变。

    此外,如果有人试图赋值,编译器将在编译类型上防止此编码错误。

    考虑一下:

     public void businessRule( SomeImportantArgument important )  {
          if( important.xyz() ){
              doXyz();
          }
          // some fuzzy logic here
          important = new NotSoImportant();
          // add for/if's/while etc 
    
         if( important.abc() ){ // <-- bug
             burnTheHouse();
         }
      } 
    

    假设你被派去解决一个不时烧掉房子的神秘虫子。

    你知道什么不是参数,你不明白的是 为什么 这个 burnTHeHouse 如果不满足条件,则调用方法(根据您的发现)

    你得花点时间才能在中间的某个地方找到, 索蒙 更改引用,并且您正在使用 其他 对象。

    使用 最终的 有助于防止这种事情发生。

    松耦合:避免使用 实现类型如 'LinkedList';使用接口 相反

    如果我知道我特别需要 LinkedList ,为什么我不使用它向未来的开发人员明确说明我的意图?返回类路径中最高的类是一回事,但为什么我不声明我的变量是最严格的呢?

    在这种情况下没有区别。我想既然你不使用 链表 具体功能建议是公平的。

    今天,linkedlist是有意义的,但是通过使用一个界面,你可以帮助你自己(或者其他人)在不方便的时候轻松地改变它。

    对于小型的个人项目,这可能根本没有意义,但是由于您已经在使用分析器,我想您已经开始关心代码质量了。

    同时,帮助经验不足的开发人员养成良好的习惯。[我不是说你是一个,但分析仪不认识你;)]

    AvoidSynchronizedMethodLevel:使用 块级而不是方法级 同步

    块级同步比方法级同步有什么优势?

    同步段越小越好。就是这样。

    此外,如果在方法级别进行同步,则会阻止整个对象。在块级同步时,只需同步特定的部分,在某些情况下这正是您所需要的。

    avoidusingshorttype:不要使用 短型

    我的第一语言是C语言和C++语言,但是在Java世界中,为什么我不应该使用最能描述我的数据的类型呢?

    我从来没听说过这个,我同意你的看法:)我从来没有用过short。

    我猜不使用它,你会帮助你自己升级到 int 无缝连接。

    与性能优化相比,代码气味更倾向于代码质量。因此,建议是给经验不足的程序员,以避免陷阱,而不是提高程序速度。

    这样,在试图更改代码以适应更好的设计时,您可以节省大量时间和挫折。

    如果建议没有意义,就忽略它们,记住,你是负责的开发人员,这个工具就是一个工具。如果出了问题,你不能怪工具,对吧?

        3
  •  3
  •   Thorbjørn Ravn Andersen    13 年前

    只是一张便条 final 问题。

    在变量上加上“final”只会导致它是可赋值的 一旦 . 这并不一定意味着写作更容易,但最肯定的是意味着 阅读 为了将来的维修人员。

    请考虑以下几点:

    • 任何变量 最终的 可以立即分类为“在观看时不会改变价值”。
    • 这意味着,如果所有不改变的变量都用final标记,那么没有final标记的变量实际上会改变。

    这意味着当你通过定义部分读取变量时,你可以看到,因为它们可能会在代码中改变值,维护者可以在代码可读性更好的情况下花费精力。

        4
  •  1
  •   Michael Borgwardt    15 年前

    不会将对象设置为空 协助垃圾收集,如果 对象是本地对象(未使用 方法之外的)?或者那是 神话?

    它所做的唯一事情是使对象能够在方法结束之前被gcd,这是很少有必要的。

    使用最终参数和变量有什么好处吗?

    它使代码更加清晰,因为在分析代码时,您不必担心在某个位置更改值。通常情况下,一旦变量被设置,您就不需要或不想更改它的值。

    如果我知道我特别需要 链接列表,为什么我不使用 明确我的意图 未来的开发商?

    你能想出为什么你特别需要一个 LinkedList?

    只有一件事 返回最高的班级 有意义的类路径,但为什么 我不声明我的变量是 严格意义上的?

    我不太关心局部变量或字段,但是如果您声明类型为 LinkedList ,我会追捕你并伤害你,因为这让我无法使用 Arrays.asList() Collections.emptyList() .

    块级同步比方法级同步有什么优势?

    最大的一点是,它使您能够使用一个专用的监视器对象,以便只有那些关键部分是互斥的,而不是所有使用同一个监视器的部分。

    在Java世界里,为什么我不能 使用最能描述我的 数据?

    因为小于int的类型在所有计算中都会自动升级为int,您必须向下转换才能为它们分配任何内容。这会导致代码混乱和相当多的混乱(特别是当涉及到自动装箱时)。

        5
  •  0
  •   DefyGravity    15 年前

    avoidusingshorttype:不要使用short类型

    • 列表项

      短是16位,2是Java的恭维

    • 一个短的数学运算,如果整数族中的任何内容不属于另一个短的,则需要将运行时符号扩展转换为更大的值。对浮点操作需要符号扩展和到ieee-754的非平凡转换。
    • 找不到证据,但是用一个32位或64位寄存器,你就不再在字节码级上保存“处理器指令”了。你把一辆小型车停在半挂车的停车场,就处理器寄存器而言。
    • 如果你在字节码级别优化你的项目,哇。哇哦。;P
    • 我同意忽略这个pmd警告的设计方面,只是用一个“short”来精确地描述你的对象,而不是相应的性能转换。
    • 在我看来,在大多数机器上产生的性能影响是微乎其微的。忽略错误。
        6
  •  0
  •   user2427    14 年前

    块级别有什么优势 同步已超过方法级别 同步? 同步方法就像执行 synchronize(getClass()) 封锁,封锁所有的班级。

    也许你不想那样