Java 为局部变量赋值配置CheckStyle而不是final

Java 为局部变量赋值配置CheckStyle而不是final,java,final,checkstyle,Java,Final,Checkstyle,我是否可以将CheckStyle配置为在分配局部变量(初始化除外)时出错?基本上默认所有局部变量为final,而不必在代码中放入大量final关键字 在Java中,声明局部变量final将确保它在初始化后不会被赋值。这是非常有用的,并且可以更容易地对代码进行推理。我认为所有的变量都应该是最终的,除非有特定的原因。遗憾的是,在Java中,这要求我将final放在所有不必要地增加代码的内容之前 我注意到了。这意味着我不必再把期末考试放在这些考试前面了。有没有办法让CheckStyle为任何其他局部变

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

在Java中,声明局部变量final将确保它在初始化后不会被赋值。这是非常有用的,并且可以更容易地对代码进行推理。我认为所有的变量都应该是最终的,除非有特定的原因。遗憾的是,在Java中,这要求我将final放在所有不必要地增加代码的内容之前

我注意到了。这意味着我不必再把期末考试放在这些考试前面了。有没有办法让CheckStyle为任何其他局部变量赋值(初始化除外)提供类似的错误?这样我就不需要把所有的东西都标记为最终的

我只看到了

如果出于某种原因,您希望多次分配给变量,那么只需在该行上添加注释以禁用CheckStyle。这有点像其他语言,默认情况下所有变量都是最终的,您必须使用一个特殊的关键字使其可赋值


PS:我也愿意用其他方法在Java中实现这一点,而不必使用CheckStyle。

没有现成的方法。我还检查了(一个带有附加检查的库),它通常有我需要的东西,但似乎没有任何东西。我已经链接到支票上了,这样你就可以自己查看了,以防我遗漏了什么

那就意味着你必须这么做。这不应该太难。我要复制的代码已经完成了大部分繁重的工作:它已经找到了永不改变的局部变量,您只需要确保每个变量都是这样

如果你这样做,可能会考虑向CHECKTYPE或SEVNTU提出拉请求。< /P>


可选地,如果你只反对使用<代码>最终< /C> >因为它是冗长的,你可以考虑使用龙目岛(像java 10的代码> var <代码>,但隐式最终的,在java 10之前可用)。但是,如果其他开发人员正在使用您的代码库,则很难强制将其作为构建的一部分使用(不编写检查,这是您试图避免的)。

听起来您只是想禁止重新分配。不清楚是否要禁止非最终变量,如for循环中递增/递减变量的情况,因此我假设您仍然希望允许。这可以通过和来完成

例如:

$ 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.
$cat TestClass.java
公共类TestClass{
int字段=0;
void方法(){
int a=0;
a=1;
a+=1;
a-=1;
a*=1;
a/=1;
a=1;
a>>=1;
a++;
a——;
++a;
--a;
对于(inta=0;a<5;a++){
}
}
$cat TestConfig.xml
$java-jar checkstyle-8.18-all.jar-c TestConfig.xml TestClass.java
正在启动审核。。。
[错误]TestClass.java:6:3:不允许使用“=”。[非法代币]
[错误]TestClass.java:7:3:不允许使用“+=”。[非法代币]
[错误]TestClass.java:8:3:不允许使用“-=”。[非法代币]
[错误]TestClass.java:9:3:不允许使用“*=”。[非法代币]
[错误]TestClass.java:10:3:不允许使用“/=”。[非法代币]
[错误]TestClass.java:11:3:不允许使用“=”。[非法代币]
[错误]TestClass.java:13:3:不允许使用'>>>='。[非法代币]
[错误]TestClass.java:14:2:不允许使用“++”。[非法代币]
[错误]TestClass.java:15:2:不允许使用“---”。[非法代币]
[错误]TestClass.java:16:1:不允许使用“++”。[非法代币]
[错误]TestClass.java:17:1:不允许使用“---”。[非法代币]
审计完成。
Checkstyle以12个错误结束。
您可以注意到,在这个示例中,变量赋值没有被禁止,for循环也没有被禁止


如果将变量与其声明分开初始化,则此操作将不起作用。

我们已经在使用Lombok。我将签出
val
。这听起来很有希望。否则可能会进行自定义检查。@MatthijsWessels是的。遗憾的是,他们在实际语言中与
var