Код стайл для языка Java - lanit-tercom-school/grouplock GitHub Wiki
- Отступ от начала предыдущей строки равняется четырём пробелам.
- Две пустых линии используются, чтобы разделять объявления классов и интерфейсов.
- Одна пустая линия должна разделять:
- Методы
- Локальные переменные в методе и первое выражение
- Блок или отдельную строку комментариев
- Логически разделенные части в методе, чтобы улучшить читабельность
Скобка переносится на новую строку при определении пространств имен (namespaces) и классов (classes). В остальных случаях скобка остается на той же строке.
class MyClass
{
int foo() {
makeStuff();
makeAnotherStuff();
}
}
- Максимальная длина строки равна 120 символам. Если аргументы метода не помещаются на одной строке, их следует разбивать на несколько строк; новую строку следует начинать на одну позицию правее открывающей скобки списка аргументов.
// Правильно
int lotsOfArgs(int anInteger, long aLong, short aShort,
double aDouble, float aFloat, String aString);
// Неправильно
int lotsOfArgs(int anInteger, long aLong, short aShort, double aDouble, float aFloat, String aString);
- В сложных выражениях размещайте каждое условие на отдельной строке.
// Правильно
if ((('0' <= inChar) && (inChar <= '9'))
|| (('а' <= inChar) && (inChar <= 'z'))
|| (('A' <= inСhar) && (inСhar <= 'Z'))) {
/* .... */
}
// Неправильно
if ((('0' <= inChar) && (inChar <= '9')) || (( 'а' <= inChar) && (inChar <= 'z')) || (( 'A' <= inСhar) && (inСhar <= 'Z'))) {
/* .... */
}
- Всегда располагайте один оператор на строке.
// Правильно
a = b + 1;
c++;
// Неправильно
a = b + 1; c++;
- Тело операторов
if
,else if
,do
,while
,for
необходимо всегда выделять фигурными скобками, а перед каждым оператором ставить отступ – четыре пробела.
// Правильно
if (x == y) {
makeSomeStuff();
makeSomeOtherStuff();
} else if (x > y) {
singleLine();
} else {
doThis();
doThat();
}
for (int i = 0; i < 10; i++) {
statements;
}
// Неправильно
if (x == y) {
makeSomeStuff();
makeSomeOtherStuff();
} else if (x > y)
singleLine();
else
{
doThis();
doThat();
}
for (int i = 0; i < 10; i++) statement;
- Слово
while
не переносится на новую строку
do {
doThis();
doThat();
} while (condition);
- Форма тернарного оператора:
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;
- Операторы
case
должны находиться в той же колонке, что и операторswitch
. - Каждый случай должен заканчиваться оператором
break
(илиreturn
) или комментарием, чтобы показать, что далее следует другой случай.
switch (myEnum) {
case Value1:
doSomething();
break;
case Value2:
case Value3:
doSomethingElse();
// fall through
default:
defaultHandling();
break;
}
Выражение типа try-catch
должно иметь следующий вид:
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
doStuff();
}
- Необходимо вставлять пробел между операциями присваивания, логическими и арифметическими операциями.
// Правильно
if (i == 0) {
/* ... */;
}
a += 3;
a = b + c;
// Неправильно
if (i = = 0) {
/* ... */;
}
a+ =3;
a=b+c;
- Не следует оставлять пробел после унарной операции.
if (!flag) {
break;
}
- Все названия должны быть на английском языке.
- Названия пакетов должны быть написаны строчными буквами
mypackage, com.company.application.ui
- Названия классов должны быть существительными и написаны в PascalCase (название переменной пишется слитно, каждое новое слово начинается с заглавной буквы).
class Raster;
class ImageSprite;
- Названия интерфейсов должны быть в PascalCase.
interface RasterDelegate;
interface Storing;
- Названия методов должны начинаться с глагола и быть написаны в camelCase (название пишется слитно и начинается со строчной буквы, каждое новое слово начинается с заглавной буквы).
initialize();
cookApplePie();
- Имена переменных должны быть в camelCase. Старайтесь избегать однобуквенных имен, за исключением временных «ненужных» переменных (например для счётчиков удобно использовать название
i
).
float myWidth;
int i;
- Имена констант должны быть написаны заглавными буквами, слова разделяются нижним подчеркиванием.
int MIN_WIDTH = 4;
int MAX_WIDTH = 999;
int GET_THE_CPU = 1;
- Элементы перечисляемого типа должны быть написаны заглавными буквами, слова разделяются нижним подчеркиванием.
enum Season {
WINTER, SPRING, SUMMER, AUTUMN
}
- Следует избегать аббревиатур, кроме случаев, где аббревиатура более известна, чем полное название. Аббревиатуры должны быть в camelCase.
exportHtmlSource();
- В названиях переменных и методах типа
boolean
следует использовать префиксis
илиhas
.
isSet, isVisible, isFinished(), isOpen(); hasThis, hasThat
- Следует использовать
compute
в методах, где подсчитывается какое-то значение,find
– в методах, где что-то ищется.
valueSet.computeAverage();
matrix.computeInverse()
vertex.findNearestVertex();
matrix.findSmallestElement();
- Используйте множественное число для коллекций объектов.
Collection<Point> points;
int[] values;
- Избегайте отрицательных префиксов для переменных и методов типа
boolean
.
// Правильно
bool isError;
bool isFound;
// Неправильно
bool isNoError;
bool isNotFound;
- Все поля должны объявляться в начале класса.
- Классы и интерфейсы должны объявляться следующим образом:
- Статические переменные класса в порядке
public
,protected
,package-private
,private
- Остальные переменные класса в порядке
public
,protected
,package-private
,private
- Конструкторы
- Методы
- Статические переменные класса в порядке
- Объявляйте класс как
final
, если необходимо исключить наследование данного класса.
final class MyFinalClass {
/* body */
}
- Модификаторы метода должны идти в следующем порядке:
<access> static abstract synchronized transient final native
.
// Правильно
public static double square(double a);
// Неправильно
static public double square(double a);
- Объявляйте метод, переменную или аргумент метода как
final
, если он(-а) не должен(-на) подвергаться изменениям.
public final int doStuff(final int i) {
final int myFinalVar = i * 10;
/* body */
}
- Приведение типов следует писать в явном виде.
// Правильно
floatValue = (int) intValue;
// Неправильно
floatValue = intValue;
- Массивы следует объявлять скобками рядом с типом.
// Правильно
double[] coeffs;
int[] points;
// Неправильно
double coeffs[];
int points[];
- Все комментарии пишутся на английском языке.
- Комментарии описывают, что делает код, а не как.
- Не стоит писать комментарии ради комментариев.
- Блоки и отдельные строки комментариев должны быть сдвинуты так же, как и окружающий их код.
- Можно использовать различные формы записи комментариев.
// single-line comment
/*
* multi-line
* comment
*/
/*
* another
* multi-line comment */
- Используйте комментарии
TODO
для кода, который является временным, краткосрочным, или хорошим, но не идеальным. Также следует вставлять конкретную дату, к которой проблема должна быть решена, или же конкретное событие.
// TODO: Change this to use flag instead of constant by Dec 31
// TODO: Delete this method after v1.2 release
- Каждый класс и
public
метод должен содержать Javadoc, по крайней мере, с одной фразой, описывающей, что он делает. Фраза должна начинаться с описательного глагола 3-го лица.
/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
}
/**
* Constructs a new String by converting the specified array of
* bytes using the platform's default character encoding.
*/
public String(byte[] bytes) {
}
- Вам не нужно описывать Javadoc для тривиальных
get
иset
методов, таких какsetFoo()
, если ваш Javadoc говорит только/* Sets Foo */
. - Если при использовании метода необходимо выполнять какие-либо ограничения, или если действие метода имеет важный эффект в другом месте программы, обязательно опишите это в документации.
- Не пишите слишком длинных методов.
- Метод должен делать ровно то, что написано в его названии. Если метод делает что-либо еще, разделите его на несколько методов.
- Локальные переменные: ограничивайте область видимости.
- Следует избегать использования «магических» чисел в коде, любые числа кроме 0 и 1 должны быть записаны в константы.
// Правильно
private static final int TEAM_SIZE = 11;
...
Player[] players = new Player[TEAM_SIZE];
// Неправильно
Player[] players = new Player[11];
- Следует использовать аннотацию
@Override
, если метод переопределен.
@Override
public void overrideMe() {
doSomething();
}