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

2022-09-01 06:08:21

数据流异常分析:发现变量“变量”的“DD”异常(行“n1”-“n2”)。

数据流异常分析:发现变量“变量”的“DU”异常(行“n1”-“n2”)。

DD和DU听起来很熟悉...我想在诸如测试和分析之类的事情上说与最弱的前期和后期条件有关,但我不记得具体细节。

NullAssignment:将 Object 赋给 null 是一种代码异味。考虑重构。

如果对象是本地对象(不在方法外部使用),那么设置对象以帮助垃圾回收吗?还是说这是个神话?null

MethodArgumentCouldBeFinal:参数'param'未分配,可以声明为最终参数

局部变量CouldBeFinal:局部变量“变量”可以声明为最终变量

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

松散耦合:避免使用“LinkedList”等实现类型;改用界面

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

避免同步方法级别:使用块级别而不是方法级别同步

块级同步与方法级同步相比有哪些优势?

避免使用短类型:不使用短整型

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


答案 1
  • DD和DU异常(如果我没记错的话-我使用FindBugs,消息有点不同)是指将值分配给从未读取的局部变量,通常是因为在读取之前重新分配了另一个值。一个典型的情况是在声明时初始化一些变量。在需要变量之前不要声明它。null

  • 为了“协助”垃圾回收器而分配给局部变量是一个神话。PMD让您知道这只是适得其反的混乱。null

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

  • 根据以下条件指定接口:好吧,界面是一个很好的设计实践。您可以轻松更改集合的实现,而不会影响调用方。这就是接口的全部意义所在。

  • 我想不出很多情况下调用者需要一个,因为它不会公开任何不是由某些接口声明的API。如果客户端依赖于该 API,则可以通过正确的接口使用它。LinkedList

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

  • 在任何操作中,类型的操作数都会提升为。此规则让您知道此升级正在发生,您也可以使用 .但是,使用该类型可以节省内存,因此,如果它是实例成员,我可能会忽略该规则。shortintintshort


答案 2

数据流异常分析:发现变量“变量”的“DD”异常(行“n1”-“n2”)。

数据流异常分析:发现变量“变量”的“DU”异常(行“n1”-“n2”)。

不知道。

NullAssignment:将 Object 赋给 null 是一种代码异味。考虑重构。

如果对象是本地对象(不在方法外部使用),那么将对象设置为 null 难道不会有助于垃圾回收吗?还是说这是个神话?

一旦方法返回,本地方法中的对象将被标记为垃圾回收。将它们设置为 null 不会产生任何差异。

由于它会使开发人员经验不足,因此空赋值的所有内容都可以被视为代码异味。

MethodArgumentCouldBeFinal:参数'param'未分配,可以声明为最终参数

局部变量CouldBeFinal:局部变量“变量”可以声明为最终变量

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

它更清楚地表明,该值在对象的生命周期中不会更改。

此外,如果有人试图分配一个值,编译器将防止编译类型出现此编码错误。

考虑一下:

 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

你需要一段时间才能发现,在中间的某个点上,somone改变了引用,并且你正在使用其他对象。

使用帮助来防止这种事情。final

松散耦合:避免使用“LinkedList”等实现类型;改用界面

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

在这种情况下,没有区别。我认为,由于您没有使用特定功能,因此建议是公平的。LinkedList

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

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

此外,帮助经验不足的开发人员养成良好的习惯。[我不是说你是其中之一,但分析仪不知道你;)]

避免同步方法级别:使用块级别而不是方法级别同步

块级同步与方法级同步相比有哪些优势?

同步部分越小越好。就是这样。

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

避免使用短类型:不使用短整型

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

我从来没有听说过这个,我同意你:)我从来没有用过短。

我的猜测是,如果不使用它,你将帮助你的自我无缝升级。int

代码异味比性能优化更注重代码质量。因此,建议给经验不足的程序员并避免陷阱,而不是提高程序速度。

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

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


推荐