Статьи

Распространенные нарушения кода в Java

На работе недавно я выполнил очистку кода существующего проекта Java. После этого упражнения я увидел общий набор нарушений кода, которые снова и снова встречаются в коде. Итак, я составил список таких распространенных нарушений и поделился им со своими коллегами, чтобы осознание помогло улучшить качество и удобство сопровождения кода. Я делюсь списком здесь для большей аудитории.

Список не в каком-то определенном порядке и все происходит от правил, применяемых такими инструментами качества кода, как CheckStyle , FindBugs и PMD .

Вот так!

Отформатируйте исходный код и упорядочите импорт в Eclipse:

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

  • Ctrl + Shift + F — форматирует исходный код.
  • Ctrl + Shift + O — организует импорт и удаляет неиспользованные.

Вместо того чтобы вручную вызывать эти две функции, вы можете настроить Eclipse на автоматическое форматирование и автоматическую организацию при сохранении файла. Для этого в Eclipse перейдите в « Окно» -> «Настройки» -> «Java» -> «Редактор» -> «Сохранить действия», а затем включите « Выполнить выбранные действия при сохранении» и установите флажок « Форматировать исходный код» + « Организовать импорт» . Избегайте множественных возвратов (точек выхода) в методах:

В ваших методах убедитесь, что у вас есть только одна точка выхода . Не используйте возвраты более чем в одном месте в теле метода.

Например, приведенный ниже код НЕ РЕКОМЕНДУЕТСЯ, поскольку он имеет более одной точки выхода (операторы возврата).

1
2
3
4
5
6
7
private boolean isEligible(int age){
  if(age > 18){
    return true;
  }else{
    return false;
  }
}

Приведенный выше код можно переписать следующим образом (конечно, приведенный ниже код еще можно улучшить, но это будет позже).

1
2
3
4
5
6
7
8
9
private boolean isEligible(int age){
  boolean result;
  if(age > 18){
    result = true;
  }else{
    result = false;
  }
  return result;
}


Упростите методы if-else:

Мы пишем несколько служебных методов, которые принимают параметр, проверяют некоторые условия и возвращают значение, основанное на условии. Например, рассмотрим метод isElitable, который вы только что видели в предыдущем пункте.

1
2
3
4
5
6
7
8
9
private boolean isEligible(int age){
  boolean result;
  if(age > 18){
    result = true;
  }else{
    result = false;
  }
  return result;
}

Весь метод может быть переписан в виде одного оператора возврата, как показано ниже.

1
2
3
private boolean isEligible(int age){
  return age > 18;
}


Не создавайте новые экземпляры Boolean, Integer или String:

Избегайте создания новых экземпляров Boolean, Integer, String и т. Д. Например, вместо использования new Boolean(true) , используйте Boolean.valueOf(true) . Более поздний оператор имеет тот же эффект, что и предыдущий, но он улучшил производительность.

Используйте фигурные скобки вокруг операторов блока.

Никогда не забывайте использовать фигурные скобки вокруг операторов уровня блока, например if , for , while . Это уменьшает неоднозначность вашего кода и исключает вероятность появления новой ошибки при изменении оператора уровня блока.

НЕ РЕКОМЕНДУЕТСЯ

1
2
3
4
if(age > 18)
  result = true;
else
  result = false;

РЕКОМЕНДУЕМЫЕ

1
2
3
4
5
if(age > 18){
  result = true;
}else{
  result = false;
}


Отметьте параметры метода как окончательные, где это применимо:

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

РЕКОМЕНДУЕМЫЕ

1
private boolean isEligible(final int age){ ... }


Назовите открытые статические конечные поля в UPPERCASE:

Всегда называйте открытые статические конечные поля (также известные как константы ) в UPPERCASE. Это позволяет легко отличать постоянные поля от локальных переменных.

НЕ РЕКОМЕНДУЕТСЯ
public static final String testAccountNo = '12345678';

РЕКОМЕНДУЕМЫЕ
public static final String TEST_ACCOUNT_NO = '12345678'; ,

Объедините несколько операторов if в одно:

Везде, где возможно, попытайтесь объединить несколько операторов if в один.

Например, приведенный ниже код;

1
2
3
4
5
if(age > 18){
  if( voted == false){
    // eligible to vote.
  }
}

может быть объединен в отдельные операторы if , как:

1
2
3
if(age > 18 && !voted){
  // eligible to vote
}


переключатель должен иметь значение по умолчанию :

Всегда добавляйте регистр по умолчанию для операторов switch .

Избегайте дублирования строковых литералов, вместо этого создайте константу:

Если вам нужно использовать строку в нескольких местах, не используйте ее как литерал. Вместо этого создайте строковую константу и используйте ее.

Например, из приведенного ниже кода,

1
2
3
4
5
6
private void someMethod(){
  logger.log('My Application' + e);
  ....
  ....
  logger.log('My Application' + f);
}

Строковый литерал «My Application» можно сделать константой и использовать в коде.

1
2
3
4
5
6
7
8
public static final String MY_APP = 'My Application';
 
private void someMethod(){
  logger.log(MY_APP + e);
  ....
  ....
  logger.log(MY_APP + f);
}


Дополнительные ресурсы:

Ссылка: Общие нарушения кода в Java от нашего партнера JCG Веры Сундар в блоге