【问题标题】:Why does PMD suggest making fields final?为什么 PMD 建议将字段设为 final?
【发布时间】:2013-03-07 08:12:10
【问题描述】:

我创建了 Android 应用程序并在其上运行静态分析工具 PMD。而我不明白的是为什么它会给我警告并说在可能的情况下声明字段最终,就像在这个例子中一样。

final City selectedItem = (City) arg0.getItemAtPosition(arg2);
new RequestSender(aaa).execute(xxx, selectedItem.getId());

它只是启动内部 AsyncTask 实例。将其宣布为最终风格是一种好风格吗?为什么?为了可读性,我创建了一个新对象,但 PMD 说它应该是最终的。

【问题讨论】:

  • 是否有理由将RequestSender 的实例存储在属性中?为什么不只是new RequestSender(aaa).execute(xxx,yyy);
  • 是的,你是对的。谢谢!但这只是示例,所以我会更新我的问题。
  • 我给了 -1 因为 staticfinal 是不同的。选择正确的单词并在标题中使用它。不过更好,先搜索一下,比如:[java] why make variable final.
  • 哦,对不起,这是个愚蠢的错误。我知道区别。

标签: java android pmd


【解决方案1】:

这里有两个不同的东西(你说的是静态和最终)。

关于final,如果您创建一个不会更改的引用(对象本身可以修改),最好将其声明为final,原因有两个:

  • 它有助于编译器进行小的性能优化
  • 它可以帮助您(或您的开发伙伴)了解此引用不会被更改 - 它提供了一个信号。

关于static(对于变量,关键字对于不同类型的结构具有不同的含义),它会使您的 cityItems 对于其封闭类的所有对象都是唯一的。如果所有对象都可以使用相同的值,则复制它没有任何好处。同样,不仅要考虑编译器/性能方面,还要考虑信号:如果我看到一个带有“静态”的字段,我知道它是在所有对象之间共享的——我不需要额外的信息或文档。

在您的示例中,该字段可能应该是公共静态(如果它是共享的)或私有(公共或“package protected”字段正在破坏封装)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多