Checkstyle: Как устранить ошибку «Скрытое поле»

#java #eclipse #checkstyle

#java #eclipse #checkstyle

Вопрос:

Я получаю эту ошибку checkstyle:

 'serverURL' hides a field
  

в этом

  private static void setServerURL(final String serverURL) {
    Utility.serverURL = serverURL;
 }
  

В чем может быть причина и как ее устранить?

Ответ №1:

Уже определена переменная serverURL , доступная для этого метода (дополнительно к формальному параметру, который вы принимаете). Это называется «затенение».

Я думаю, что большинство Java-программистов отключают эту проверку, потому что на самом деле это не так уж и запутанно.

Например, это вызвало бы ошибку:

 public class Foo {
  private int bar = 0;

  public void someMethod(int bar) {
    // There are two bars!  All references in this method will use the parameter bar,
    // unless they are explicitly prefixed with 'this'.
    this.bar = bar;
  }
}
  

Комментарии:

1. Как вы видите, метод статический, я не могу использовать это

2. @CoryKendall Что вы предлагаете для решения этой проблемы?

3. Решение состоит в том, чтобы отключить проверку или заменить имя одного из bar s на что-то другое.

4. Этот ответ можно улучшить, указав, как отключить этот checkstyle.

Ответ №2:

Я думаю, что в конструкторах и установщиках очень часто заданное имя поля совпадает с именем параметра установщика. Вот почему я рекомендую эту конфигурацию:

 <module name="HiddenField" >
    <property name="ignoreSetter" value="true" />
    <property name="ignoreConstructorParameter" value="true" />
</module>
  

Таким образом, другие случаи скрытого поля по-прежнему запрещены.

Комментарии:

1. все еще не работает с вышеуказанными свойствами в моем XML-файле checkstyle.

Ответ №3:

Параметр и статическое поле имеют одинаковое имя. Просто переименуйте один из них. Некоторые люди следуют соглашению об именовании, которое добавляет ко всем параметрам префикс p . Тогда у вас было бы serverURL имя поля и pServerURL имя параметра. Или вы могли бы просто отключить проверку.

Ответ №4:

Я решил ее, отключив в eclipse. Я искал, как это сделать, когда попал на эту страницу. Я не нашел ответа в топ-10 запросов Google, поэтому мне пришлось разобраться с этим на собственном опыте. Для тех, кто ищет это, вот как я это сделал:

Открыть

Eclipse> Настройки> Checkstyle

Найдите конфигурацию checkstyle, которую вы используете (возможно, вы установили ее или используете по умолчанию, и в этом случае лучше создать собственную копию, а затем отредактировать ее). Выберите это, а затем нажмите кнопку настроить с правой стороны. Найдите следующую конфигурацию в списке:

Проблемы с кодированием> Скрытое поле

Откройте конфигурацию (в пользовательском интерфейсе есть кнопка «Открыть»).

Снимите флажок «Объявление параметра». Нажмите OK, затем нажмите OK, а затем нажмите OK.

Комментарии:

1. По какой-то причине в моем стиле проверки было несколько параметров «скрытое поле» в разделе «Проблемы с кодированием». Я отключил их все, затем включил только один и следовал инструкциям выше, и это сработало. Хотел сделать плагин для уточнения на случай, если у других возникнет такая же проблема.

2. Как насчет исправления кода, чем отключить проверку? смотрите ответ Кори Кендалла

3. @Ханнес уверен. Это именно то решение, которое checkstyle предлагает пользователю. Однако люди, попадающие на эту страницу, ищут способы заставить checkstyle прекратить предупреждать об этом.

Ответ №5:

Просто измените имя параметра ur в методе ur

 private static void setServerURL(final String serverURL) {
Utility.serverURL = serverURL;
}
  

Для

 private static void setServerURL(final String serverURLXYZ) {
Utility.serverURL = serverURLXYZ;
}
  

Наслаждайтесь…

Джигар Патель

Комментарии:

1. аххххххххххххх!

2. Это не чистое решение 🙂

Ответ №6:

Довольно глупая ошибка, но вот простое исправление, которое я вставил в свои настройки, чтобы исправить это:

было:

 public void setName(String name) {
  this.name = name;
}
  

обновлено:

 public void setName(String val) {
  this.name = val;
}
  

Комментарии:

1. Это не чистое решение 🙂

2. @th3an0maly С ограничениями checkstyle это самая простая вещь, которую я мог понять. Что вы предлагаете более чистого?