Настройте CheckStyle вместо final для назначения локальной переменной - PullRequest
0 голосов
/ 25 февраля 2019

Могу ли я настроить CheckStyle на ошибку при назначении локальных переменных (кроме инициализации)? По сути, все локальные переменные по умолчанию являются окончательными без необходимости добавлять тонну конечных ключевых слов в код.

В Java объявление локальной переменной final гарантирует, что она никогда не будет назначена после ее инициализации.Это очень полезно и значительно упрощает анализ кода.Я придерживаюсь мнения, что все переменные должны быть окончательными, если нет какой-либо конкретной причины.К сожалению, в Java это требует, чтобы я ставил final перед всем, что imho разлагает код без необходимости.

Я заметил, что CheckStyle может давать ошибку при назначении параметров функций .Это означает, что мне больше не нужно ставить перед ними финал.Есть ли способ заставить CheckStyle выдавать аналогичную ошибку для любого другого назначения локальной переменной (кроме инициализации)?Таким образом, мне не нужно отмечать все как окончательное.

Я вижу только правило, которое заставляет меня ставить final для переменных, которые можно пометить как таковые .

Если по какой-либо причине вы захотите присвоитьпеременная несколько раз, вам просто нужно добавить комментарий, чтобы отключить CheckStyle в этой строке.Это похоже на другие языки, которые в основном делают все переменные окончательными по умолчанию, и вам нужно было бы использовать специальное ключевое слово, чтобы назначить его.

PS: Я также открыт для других способов достижения этого вJava без CheckStyle.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Похоже, вы просто хотите запретить повторное назначение.Непонятно, хотите ли вы запретить неконечные переменные, такие как циклы for, где вы увеличиваете / уменьшаете переменную, поэтому я предполагаю, что вы все еще хотите это разрешить.Это можно сделать с помощью IllegalTokenCheck и Подавлений XPath .

Пример:

$ 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.

Вы можете заметить в примере присвоение переменной isn 't запрещено и цикл for не запрещен.

Это не будет работать, если вы инициализируете переменную отдельно от ее объявления.

0 голосов
/ 25 февраля 2019

Нет способа сделать это из коробки.Я также проверил Sevntu Checkstyle (библиотека с дополнительными проверками), которая часто имеет то, что мне нужно, но, похоже, ничего для этого не имеет.Я связался с чеками, чтобы вы могли сами убедиться, что я что-то пропустил.

Это означает, что вам придется выписать чек самостоятельно .Это не должно быть слишком сложно.Я бы скопировал код для FinalLocalVariable, который уже выполняет большую часть тяжелой работы: он уже находит локальные переменные, которые никогда не меняются, вам просто нужно убедиться, что каждая переменная такова.

Если вы сделаете это, возможно, рассмотрите возможность сделать запрос на извлечение в Checkstyle или Sevntu.

В качестве альтернативы, если вы только против использования final, потому что это многословно, вы можете рассмотреть возможность использования Lombok.val (как в Java 10 var, но неявно окончательно - и доступно до Java 10).Однако, если другие разработчики работают над вашей кодовой базой, было бы трудно принудительно использовать это как часть сборки (без написания проверки, которую вы пытались избежать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...