配置CheckStyle而不是final进行局部变量分配

时间:2019-02-25 11:19:19

标签: java final checkstyle

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

在Java中,声明局部变量fi​​nal将确保在初始化后再也不会将其赋值。这非常有用,并使推理代码变得容易得多。我认为,除非有特定原因,否则所有变量都应为最终变量。可悲的是,在Java中,这要求我将imho不必要地膨胀代码的所有内容放在最后。

我注意到了CheckStyle can error on assignment to parameters of functions。这意味着我不必再将final放在那些前面。有什么方法可以使CheckStyle对其他任何局部变量赋值(初始化除外)都给出类似的错误?这样,我不需要将所有内容都标记为最终的。

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

如果出于某种原因想要多次分配给变量,则只需在该行上添加注释以禁用CheckStyle。就像其他语言一样,默认情况下基本上所有变量都是final,因此您必须使用特殊关键字将其赋值。

PS:在不使用CheckStyle的情况下,我也愿意采用其他方式在Java中实现这一目标。

2 个答案:

答案 0 :(得分:1)

没有开箱即用的方法。我还检查了Sevntu Checkstyle(带有附加检查功能的库),它经常满足我的需要,但似乎没有任何用处。我已链接到支票,以便您自己查看,以防万一我错过了任何东西。

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

如果这样做,则可以考虑向Checkstyle或Sevntu发出拉动请求。

或者,如果您只因为过于冗长而反对使用final,则可以考虑使用Lombok的val(与Java 10的var类似,但隐式为最终语言-在Java 10之前可用) )。但是,如果其他开发人员正在使用您的代码库,则很难在构建过程中强制使用此代码(无需编写检查,这是您要避免的)。

答案 1 :(得分: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循环。

如果您将变量与声明分开进行初始化,则此操作将无效。