59

私の現在のプロジェクトでは、Javaソースファイルの最後に常に空の改行を挿入します。これは、CheckStyle(エラーレベル付き)でも適用されます。

私は長い間このトピックを探していましたが、残念ながら、これについての説得力のある理由を見つけることができません。他の開発者は、Eclipseフォーマッターの1つのチェックボックスをオンにしただけで、自動的に実行されるため、これについてはかなり無関心なようです。しかし、なぜそれが必要なのか、なぜそれが重要になるのかはまだわかりません。だから私の質問は:

Javaソースファイルの最後に空の行が必要なのはなぜですか?それは現在の必要性ですか、それとも過去の遺物であり、現在のコードベースでは望ましくありませんか?

4

9 に答える 9

40

彼らは、すべてのファイルが末尾の改行文字で終わるようにしようとしていると思います。これは、空白行、別名空の改行で終わるのとは異なります。

編集:@Easy Angelがコメントで簡潔に明確にしたように:末尾の改行="\n"および空白行="\n \ n"

私はどちらかだと思います:

  1. あなたのリードは、すべてのファイルが改行文字で終わることを義務付けていますが、すべてのファイルが空白行(つまり、改行で終わる空の行)で終わることを義務付けていると誤解されています。

  2. 彼らは、すべてのファイルの終わりを空白行(別名、改行で終わる空の行)で終了することを実際に義務付けることによって、すべてのファイルが改行文字で終わるようにしようとしています。 ?)。

エディターが実際に改行記号を表示しない限り、一部のエディターではファイルが常に明確であるとは限りません。

  1. 改行をまったく終了しません、
  2. 末尾の改行が1つで終わる、または
  3. 空白の改行、つまり2つの末尾の改行で終了します

最近のほとんどのソースコードエディタは、末尾に改行を挿入していると思います。ただし、古いより一般的なエディターを使用する場合は、ソースコードファイル(および一般的なテキストファイル)が常に末尾の改行で終わるようにします(エディターによっては、空白行/空の改行として表示されることがあります)。使用)理由:

  1. コマンドラインでファイルを表示するために使用catする場合、ファイルに末尾の改行がない場合、次の出力(シェルプロンプトやスクリプトがファイル間で出力する可能性のある視覚的な区切り文字など)は、最後の非改行文字の直後に表示されます。改行から始めるのではなく。一般に、末尾の改行により、ファイルはよりユーザーフレンドリーでスクリプトフレンドリーになりました。

  2. 一部の編集者(詳細は思い出せません)は、テキストファイルに改行がない場合、末尾に改行を自動的に挿入すると思います。これにより、ファイルが変更されたように見えます。多数のファイルを別のウィンドウで開いてからすべてを閉じると、混乱する可能性があります。エディタは保存を求めるプロンプトを表示しますが、ファイルに「実際の変更」を加えたのか、それとも自動で行ったのかがわかりません。改行を挿入しました。

  3. のようないくつかのツールdiffといくつかのコンパイラは、末尾の改行が欠落していることについて文句を言います。これは、ユーザーやツールが対処しなければならない可能性のあるノイズです。


編集:

編集者が改行を追加し、ファイルの最後に改行と空白の改行があるかどうかを確認できないことについて、Vim、Eclipse、およびEmacsをテストしました(Cygwinを使用するWindowsシステムで):「」と入力して新しいファイルを開きましたh'' e'' l'' l''o'そして[ENTER]を押さずに保存されます。各ファイルを。で調べましたod -c -t x1

  1. Vim 末尾に改行を追加しました。
  2. Emacs 末尾に改行を追加しました。
  3. Eclipseは末尾の改行を追加 しませんでした。

だが

  1. Vimでは、「hello」の下の空白行にカーソルを合わせることができませんでした。
  2. Emacsでは、「hello」の下の空白行にカーソルを合わせることができました。
  3. Eclipseでは、「hello」の下の空白行にカーソルを合わせることができませんでした。

好きなように解釈してください。


私の個人的な習慣は、テキストファイルが末尾の改行で終わるようにすることです。驚き最小の原則があると感じています。これが当てはまるツールです。この点で、ソースファイルをテキストファイルと異なるものとして扱うことはありません。

グーグルはこれを明らかにします

これは、この編集の時点で、Cコンパイラ、svn(diffのため)、diffなどからの末尾の改行が欠落していることに関する警告について説明するヒットを表示します。テキストファイル(ソースファイルを含む)がで終わるという一般的な期待があると思います。末尾の改行で、そこにある傾向がある場合は最も驚くべきことではありません(そしてノイズが少なくなります)。

最後に、これは興味深いです:

末尾に改行がないファイルをサニタイズする
テキストファイルでは、すべての行を改行文字(つまり、\ n)で終了する必要があります。これはPOSIXによって述べられており、テキストファイルは

0行以上に編成された文字を含むファイル。
次に、行は次のように定義され
ます。*0個以上の非文字と終了文字のシーケンス。


しかし、そうは言っても、これは私の個人的な習慣にすぎません。私の意見を質問する人に喜んで共有しますが、私はこれを誰にも押し付けません。私がここで言うように、これは義務付ける価値のあるものではないと思います:

私は一貫性を保つためのすべての人ですが、スタイルのあらゆるビットをマイクロ管理することにも反対しています。コーディング規約の膨大なリストを持つことは、特にそれらのいくつかが恣意的であるように思われる場合、人々がそれらに従うことを思いとどまらせるものの一部です。コーディングガイドラインは、-ilitiesを改善する最も価値のあるプラクティスに合理化されるべきだと思います。この慣行を義務付けることにより、読みやすさ、保守性、パフォーマンスなどはどの程度向上しますか?

于 2011-01-15T16:41:11.580 に答える
29

最後に余分な改行を入れる理由は次のとおりです。

最後に改行のないファイルがある場合、次にファイルを編集して別の行を追加すると、ほとんどのマージツールは既存の行が変更されたと見なします(SVNも変更されると90%確信しています)。

以下の例では、「編集前の最後の行」を含む行に改行がありません。「編集後の最後の行」に新しい行を追加しようとすると、5行目と6行目が両方とも変更済みとしてマークされていることがわかりますが、両方のバージョンの5行目の実際の内容は同じです。

EOFの前に改行なし

全員がプロジェクトリードの提案に従っている場合、これが結果になります(6行目のみが元のファイルと異なります)。これにより、マージ中の誤解も回避されます。

EOFの前に改行あり

これは大したことではないように見えるかもしれませんが、ある開発者(A)が実際に最後の行の内容を変更することを意図し、別の開発者(B)が新しい行を追加したとします。EOFの前に改行を使用していない場合、開発者Bは前の最後の行も編集して改行を追加する必要があるため、マージの競合が発生します。そして...CVS/ SVNの競合が好きなのは誰ですか?

于 2013-01-31T23:29:46.583 に答える
7

このSOの質問を見てください。。

ラルフ・リッケンバッハから恥知らずに盗まれた答え:

テキストファイルのデータの最後の行が改行またはキャリッジリターン/新しい行の組み合わせで終了していない場合、多くの古いツールは誤動作します。代わりに^Z(eof)で終了するため、その行は無視されます。

だから私はそれがほとんど過去の幽霊だと思います。残念ながら、そのような幽霊は、適切に追い払わないと、尻尾を噛む可能性があります。(ビルドサーバーは古く、要約などに古いシェルスクリプトを使用しています)。

于 2011-01-15T15:28:16.317 に答える
2

ファイル全体をカットアンドペーストしてみてください。checkstyleまたはEclipseの何かのバグ:)

于 2011-02-16T15:35:59.793 に答える
2

末尾に改行文字があることについてすでに述べた正当な理由(古いツールとdiffで発生する可能性のある問題)とは別に、これを確認する別の方法があります。

ファイル内の他のすべての行に改行文字が含まれているのに、改行文字を追加しないことで最後の行を特殊な場合にするのはなぜですか?

于 2013-02-21T22:58:01.163 に答える
1

コンパイラが正しく解析しない場合があります。

Error: Reached end of file while parsing

于 2011-01-15T16:42:40.033 に答える
0

これは単なるコーディングスタイルです。何も傷つけたり助けたりしません。行を含めて空にするのはあなたのチームの好みのように聞こえますが、気にしないでください。なぜ誰かが実際にそれをcheckstyleに追加するのに十分気にするのか以外に、それに対して本当に良い議論はありませんか?

于 2011-01-15T15:23:49.647 に答える
0

私はそのような要件について聞いたことがありません。

実際、ファイルの最後に空白行がない場合、Javaプログラムがコンパイラ/ランタイムエラーや警告なしで実行されることを確認しました。

一部のコメント提供者が言っているように、これはコーディングスタイルの問題であるに違いありません。残念ながら、Javaのファイルの最後に空白行があることが重要である理由を示唆することはできません。実際、それは私にはまったく無意味に思えます

于 2011-01-15T15:27:30.333 に答える
0

コンパイラが警告を生成したため、一部のC ++コードに対してこれを行う必要があり、「エラーまたは警告なし」のポリシーがありました。たぶん問題は他の場所にあります...あなたはそれを処理できないdiffingツールがhaywireまたはmergeツールになっていますか?

それは本当に大したことではありません。

于 2011-01-15T15:50:47.797 に答える