Пустая новая строка в конце исходных файлов Java - PullRequest
47 голосов
/ 15 января 2011

В моем текущем проекте мы всегда вставляем пустую новую строку в конце исходных файлов Java. Мы также применяем это с CheckStyle (с уровнем ошибок).

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

Зачем нужны пустые строки в конце исходных файлов Java? Это текущая потребность или пережиток прошлого и нежелательная в современных кодах?

Ответы [ 9 ]

30 голосов
/ 15 января 2011

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

Редактировать: как @Easy Angel кратко поясняется в комментариях: завершающий символ новой строки = "\ n" и пустая строка = "\ n \n "

Я думаю, что либо:

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

  2. они пытаются обеспечить завершение каждого файла символом новой строки, фактически присвоив каждому файлу конец спустая строка (то есть пустая строка, которая заканчивается новой строкой), таким образом, файлы заканчиваются хотя бы одной новой строкой (и, возможно, избыточной дополнительной новой строкой - overkill?).

Если редактор фактически непоказывает символы новой строки, в некоторых редакторах не всегда ясно, что файл:

  1. НЕ ЗАВЕРШАЕТ символ новой строки,
  2. ENDS с одним последним newline, или
  3. ENDS с пустым символом новой строки, то есть с двумя завершающими символами новой строки

Я думаю, что большинство современных редакторов исходного кода вставляют конечный символ новой строки.Однако при использовании более старых более общих редакторов я всегда старался бы, чтобы мои файлы исходного кода (и текстовые файлы в целом) всегда заканчивались завершающей новой строкой (которая иногда получалась как пустая строка / пустая новая строка в зависимости отредактор, который я использовал), потому что:

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

  2. Я полагаю, что некоторые редакторы (я не могу вспомнить какие-либо подробности) автоматически вставят завершающий перевод новой строки, если текстфайл не хватало одного.Это заставило бы это казаться, что файл был изменен.Это может сбить с толку, если у вас есть несколько файлов, открытых в разных окнах, а затем закрыть все из них - редактор предложит вам сохранить, но вы не уверены, сделали ли вы «настоящие изменения» в файле или это просто автовставлен перевод строки.

  3. Некоторые инструменты, такие как diff и некоторые компиляторы, будут жаловаться на отсутствующий завершающий перевод строки.С этим шумом могут столкнуться пользователи и инструменты.


Редактировать:

О программередакторы, добавляющие новые строки и не имеющие возможности увидеть, есть ли новая строка против пустой новой строки в конце файла, я только что протестировал Vim, Eclipse и Emacs (в моей системе Windows с Cygwin): я открыл новый файл, набрав 'h'' e '' l '' l '' o 'и сохранены без нажатия [ENTER].Я проверил каждый файл с помощью od -c -t x1.

  1. Vim сделал добавить завершающий перевод новой строки.
  2. Emacs сделал добавить завершающий перевод новой строки.
  3. Затмение НЕ добавило завершающий символ новой строки.

Но

  1. Vim НЕ позволил мне перейти к пустой строке под словом "привет".
  2. Emacs сделал позволил мне навести курсор на пустую строку под "привет".
  3. Eclipse не сделал позволил мне навести курсор на пустую строку под "привет".

Интерпретируйте, как вам нравится.


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

Google обнаружил this :

, которые на момент этого редактирования отображают хиты, в которых говорится о предупреждениях о пропущенном завершающем переводе строки, поступающем от компиляторов C, svn (из-за diff), diff и т. Д. Мне кажется, существует общее ожидание, что текстовые файлы (включая исходные файлы)) заканчиваются завершающим символом новой строки и наименее удивительными (и менее шумными), когда они, как правило, находятся там.

Наконец этот интересен:

Санация файлов без завершающего символа новой строки
Текстовые файлы должны иметь все строки, оканчивающиеся символами новой строки (например, \ n).Это утверждается POSIX, который говорит, что текстовый файл

Файл, содержащий символы, организованные в ноль или более строк.
Строка, в свою очередь, определяется как
* Последовательностьноль или более не-символов плюс завершающий символ.


ОДНАКО , все это говорит о том, что это всего лишь моя личная практика.Я рад поделиться своим мнением со всеми, кто спрашивает, но я никому не навязываю это.Я не чувствую, что это стоит того, чтобы поручить, как я говорю здесь :

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

23 голосов
/ 01 февраля 2013

Вот веская причина для дополнительного переноса строки в конце:

Если у вас есть файл без разрыва строки в конце, в следующий раз, когда файл будет отредактирован для добавления еще одной строки, большинство инструментов слияния будут думать, что существующая строка изменилась (я уверен, что SVN также на 90%) .

В приведенном ниже примере строка, содержащая «последнюю строку перед редактированием», не имеет разрыва строки. Если мы попытаемся добавить новую строку «последняя строка после редактирования», как мы видим, обе строки 5 и 6 помечены как измененные, но фактическое содержимое строки 5 в обеих версиях одинаково.

Without line-break before EOF

Если все следуют предложению вашего руководителя проекта, это будет результатом (только строка 6 отличается от исходного файла). Это также позволяет избежать недоразумений при слияниях.

With line-break before EOF

Хотя это может показаться не большим делом, скажем, один разработчик (A) действительно намеревался изменить содержимое последней строки, а другой разработчик (B) добавил новую строку. Если перед EOF не используется разрыв строки, то возникает конфликт слияния, поскольку разработчик B был вынужден также отредактировать предыдущую последнюю строку, чтобы добавить разрыв строки. И ... кому нравятся конфликты CVS / SVN?

7 голосов
/ 15 января 2011

Посмотрите на этот ТАК вопрос. .

Ответ, бесстыдно украденный у Ральфа Рикенбаха:

Многие старые инструменты плохо себя ведут, если последний строка данных в текстовом файле не прекращается с новой строки или перевозки комбинация возврата / новой строки. Oни игнорировать эту строку, как она заканчивается вместо ^ Z (eof).

Так что я думаю, это в основном призрак прошлого. К сожалению, такие призраки могут укусить вас за хвост, если вы не изгоните их должным образом. (Ваш сервер сборки устарел и использует более старые сценарии оболочки для сводок и тому подобного).

2 голосов
/ 16 февраля 2011

Попробуйте вырезать / вставить весь файл. Что-то ошибка в checkstyle или eclipse:)

1 голос
/ 22 февраля 2013

Помимо уже упомянутых уважительных причин наличия символа новой строки (возможные проблемы со старыми инструментами и diff), есть еще один способ взглянуть на это:

Почему в специальном случае последняя строка с не добавляется символом новой строки, когда каждая вторая строка в файле имеет одну?

1 голос
/ 15 января 2011

Иногда ваш компилятор не анализирует его правильно:

Error: Reached end of file while parsing

0 голосов
/ 15 января 2011

Мы должны были сделать это для некоторого кода C ++, так как компилятор генерировал предупреждение об этом, и у нас была политика «без ошибок или предупреждений». Может быть, проблема кроется в другом месте ... у вас есть инструмент разметки, который сходит с ума или инструмент слияния, который не может справиться с этим?

Это на самом деле не имеет большого значения.

0 голосов
/ 15 января 2011

Я никогда не слышал о таком требовании.

На самом деле, я только что подтвердил, что Java-программа будет работать без каких-либо ошибок компилятора / времени выполнения или предупреждений, если в конце файла не будет пустой строки.

Это, как говорили некоторые комментаторы, должно быть проблемой стиля кодирования. К сожалению, я не могу предположить, почему может быть важно, чтобы в конце файла в Java была пустая строка. На самом деле, это кажется мне совершенно бессмысленным

0 голосов
/ 15 января 2011

Это просто стиль кодирования.Ничего не болит и не помогает.Я бы не позволил вам беспокоить это звучит так, как будто ваши команды предпочитают включать и пустую строку.На самом деле нет хорошего аргумента против этого, кроме того, почему кто-то заботится о том, чтобы добавить его в checkstyle?

...