- •1 Введение
- •1.2 Благодарности
- •3.1.1 Начальные комментарии
- •3.1.2 Операторы package и import
- •3.1.3 Объявление классов и интерфейсов
- •4 Отступы
- •4.1 Длина строк
- •4.2 Перенос строк
- •5 Комментарии
- •5.1.1 Блочные комментарии
- •5.1.2 Однострочные комментарии
- •5.1.3 Прицепные комментарии
- •5.1.4 Комментарии до конца строки
- •5.2 Комментарии для документирования
- •6 Объявления
- •6.1 Количество объявлений в строке
- •6.2 Размещение
- •6.3 Инициализация
- •6.4 Объявление классов и интерфейсов
- •7 Операторы
- •7.1 Простые операторы
- •7.2 Составные операторы
- •7.3 Оператор return
- •7.4 Операторы if, if-else, if-else-if-else
- •7.5 Оператор for
- •7.6 Оператор while
- •7.7 Оператор do-while
- •7.8 Оператор switch
- •7.9 Оператор try-catch
- •8 Пробелы
- •8.1 Пустые строки
- •8.2 Расстановка пробелов
- •9 Соглашение об именовании
- •10 Приёмы программирования
- •10.1 Доступ к переменным класса и экземпляра
- •10.2 Обращение к переменным и методам класса
- •10.3 Константы
- •10.4 Присваивание значений переменным
- •10.5.1 Скобки
- •10.5.2 Возвращаемые значения
- •10.5.4 Специальные комментарии
- •11. Примеры кода
3.1.2 Операторы package и import
Первой строчкой кода в большинстве файлов исходных кодов Java является оператор package. После него могут следовать операторы import. Например:
package java.awt;
import java.awt.peer.CanvasPeer;
3.1.3 Объявление классов и интерфейсов
Следующая таблица описывает из чего состоит объявление классов или интерфейсов, в том порядке, как они должны появиться. На стр. 19 в разделе "Пример файла исходного кода Java" приведен образец с комментариями.
|Составная часть объявления класса/интерфейса | Примечания
-----------------------------------------------------------------------------------
1|Документирующий комментарий класса/интерфейса (/**...*/) | Смотрите раздел "Комментарии для документирования" на стр. 9 о том, что должно быть в этом комментарии
2|Оператор class или interface|
3|Если необходимо, то указать комментарий реализации класса/интерфейса (/*...*/) | Здесь содержится любая дополнительная информация по классу или интерфейсу, которая не подходит для документирующего комментария.
4|Переменные (поля) класса (статические) | Сначала открытые (public), затем защищенные (protected) и, наконец, закрытые члены класса (private).
5|Переменные (поля) экземпляра |Сначала public, затем protected, после private.
6|Конструкторы|
7|Методы | Эти методы должны быть сгруппированы по функциональности, а не по области действия или доступности. Например, закрытый (private) метод класса может находится между двумя открытыми. Цель - сделать проще чтение и ясность кода.
4 Отступы
В качестве единицы отступа используется 4 пробела. Точное построение отступов (пробелы или табуляция) не определено. Табуляция должна быть установлена как 8 пробелов (не 4).
4.1 Длина строк
Избегайте строки длиннее 80 символов, так как они плохо обрабатываются многими терминалами и инструментами.
Примечание: примеры используемые в документации должны иметь более короткую длину строчек, как правило, не более 70 символов.
4.2 Перенос строк
Если выражение не умещается в одну строку, разбейте его, руководствуясь следующими основными принципами:
* Перенос после запятой
* Перенос перед оператором
* Предпочитаются переносы на более высоком уровне переносам на низком (более вложенном) уровне.
* Выравнивайте новую строку выражения так, чтобы его начало было на том же уровне как и в предыдущей строке.
* Если приведенные выше правила приводят к сбивающему с толку коду или коду, который жмется к полям справа, просто сделайте вместо этого отступ в 8 пробелов.
Несколько примеров переноса строки в вызовах методов:
function(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = function1(longExpression1,
function2(longExpression2,
longExpression3));
Следующие два примера демонстрируют разбиение арифметического выражения. Первое предпочтительнее, с разрывом за пределами скобок, расположенных на верхнем уровне.
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; // РЕКОМЕНДУЕТСЯ
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; // ИЗБЕГАТЬ
Два следующих примера иллюстрируют отступы в объявлениях методов. первый случай обычный. Во втором случае следовало бы сдвинуть вторую и третью строки далеко вправо, если бы применялись обычные отступы. Вместо этого строки сдвинуты всего на 8 позиций.
//ОБЫЧНЫЕ ОТСТУПЫ
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Objеct andStillAnother) {
...
}
//ОТСТУП НА 8 СИМВОЛОВ, ЧТОБЫ ИЗБЕЖАТЬ ОЧЕНЬ ДЛИННЫХ ОТСТУПОВ
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
В условии оператора if следует в основном использовать 8-ми символьный отступ, т.к. если использование 4-х символьного отступа затруднит поиск тела оператора. Рассмотрим пример:
//НЕ ИСПОЛЬЗУЙТЕ ТАКИЕ ОТСТУПЫ
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { //Плохой перенос
doSomethingAboutIt(); //ОЧЕНЬ ЛЕГКО ПРОПУСТИТЬ ЭТУ СТРОЧКУ
}
//ИСПОЛЬЗУЙТЕ ТАКИЕ ОТСТУПЫ В ПОДОБНЫХ СЛУЧАЯХ
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
// ИЛИ ИСПОЛЬЗУЙТЕ ЭТО
if ((condition1 && condition2) || (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
Вот 3 приемлемых способа форматирования тернарных выражений:
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;