为本地变量赋值配置CheckStyle而不是final

问题描述 投票:1回答:2

在分配局部变量(初始化除外)时,我可以将CheckStyle配置为错误吗?默认情况下,所有局部变量基本上都是最终的,而不必在代码中放入大量的最终关键字。

在Java中声明一个局部变量fi​​nal将确保它在初始化后从未被赋值。这非常有用,可以更容易地推断代码。我认为除非有某些特定原因,否则所有变量都应该是最终的。可悲的是,在Java中,这需要我把最后的东西放在imho不必要的代码中。

我注意到了CheckStyle can error on assignment to parameters of functions。这意味着我不必再将决赛放在最前面了。有没有办法让CheckStyle为任何其他局部变量赋值(初始化除外)给出类似的错误?这样我就不需要将所有内容标记为最终。

我只看到a rule that forces me to put final for variables that can be marked as such

如果由于某种原因你想要多次分配一个变量,你只需要发表评论就可以在该行上禁用CheckStyle。这有点像其他语言,默认情况下基本上使所有变量都是最终的,并且您必须使用特殊关键字使其可分配。

PS:我也很乐意在没有CheckStyle的情况下用Java实现这一目标。

java final checkstyle
2个回答
1
投票

没有办法开箱即用。我还检查了Sevntu Checkstyle(一个带有额外检查的图书馆),它经常有我需要的东西,但它似乎没有任何东西。我已经链接到支票,所以你可以自己看看,以防万一我错过了。

这意味着你必须要write the check yourself。这不应该太困难。我会复制FinalLocalVariable的代码,它已经完成了最重要的工作:它已经找到了永远不会改变的局部变量,你只需要确保每个变量都是这样的。

如果你这样做,可以考虑向Checkstyle或Sevntu提出拉取请求。

或者,如果您只是反对使用final,因为它很冗长,您可以考虑使用Lombok的val(如Java 10的var,但隐式最终 - 并且在Java 10之前可用)。但是,如果其他开发人员正在处理您的代码库,则很难强制使用它作为构建的一部分(无需编写检查,您试图避免)。


0
投票

听起来你只想禁止重新分配。目前尚不清楚是否要禁止非最终变量,例如在for循环中增加/减少变量,所以我假设你仍想允许它。这可以用IllegalTokenCheckXPath suppressions完成。

例:

$ cat TestClass.java
public class TestClass {
    int field = 0;

    void method() {
int a = 0;
a = 1;
a += 1;
a -= 1;
a *= 1;
a /= 1;
a <<= 1;
a >>= 1;
a >>>= 1;
a++;
a--;
++a;
--a;
for (int a= 0; a < 5; a++) {}
    }
}

$ cat TestConfig.xml
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<module name="Checker">
    <property name="charset" value="UTF-8"/>

    <module name="TreeWalker">
<module name="IllegalToken">
  <property name="tokens" value="ASSIGN, PLUS_ASSIGN, MINUS_ASSIGN, STAR_ASSIGN, DIV_ASSIGN, SL_ASSIGN, SR_ASSIGN, BSR_ASSIGN, POST_INC, POST_DEC, INC, DEC"/>
</module>
<module name="SuppressionXpathSingleFilter">
  <property name="checks" value="IllegalToken"/>
  <property name="query" value="//VARIABLE_DEF/ASSIGN"/>
</module>
<module name="SuppressionXpathSingleFilter">
  <property name="checks" value="IllegalToken"/>
  <property name="query" value="//LITERAL_FOR/FOR_ITERATOR//*"/>
</module>
    </module>
</module>

$ java -jar checkstyle-8.18-all.jar -c TestConfig.xml TestClass.java
Starting audit...
[ERROR] TestClass.java:6:3: Using '=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:7:3: Using '+=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:8:3: Using '-=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:9:3: Using '*=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:10:3: Using '/=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:11:3: Using '<<=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:12:3: Using '>>=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:13:3: Using '>>>=' is not allowed. [IllegalToken]
[ERROR] TestClass.java:14:2: Using '++' is not allowed. [IllegalToken]
[ERROR] TestClass.java:15:2: Using '--' is not allowed. [IllegalToken]
[ERROR] TestClass.java:16:1: Using '++' is not allowed. [IllegalToken]
[ERROR] TestClass.java:17:1: Using '--' is not allowed. [IllegalToken]
Audit done.
Checkstyle ends with 12 errors.

您可以注意到,在示例中,不禁止变量赋值,也不禁止for循环。

如果您将变量与其声明分开初始化,则此方法无效。

© www.soinside.com 2019 - 2024. All rights reserved.