Java フォーマットツール
Javaフォーマットとは?
Javaフォーマットは、乱雑なJavaコードを標準化された読みやすい形式に整理するプロセスです。適切なコードフォーマットは可読性を向上させ、デバッグを容易にし、エラーを減少させます。フォーマットには、一貫したインデント、適切な改行、演算子のスペース、括弧の整列が含まれます。圧縮はすべての空白とコメントを削除し、ファイルサイズを大幅に削減します。
使い方
使い方
- 左側の入力欄にJavaコードを貼り付けるか入力してください
- インデントサイズを選択(2スペース、4スペース、Tab)
- 「フォーマット」をクリックしてコードを整形、「圧縮」でコードを縮小
- 右側に結果を確認(シンタックスハイライト付き)
- 「コピー」をクリックしてクリップボードにコピー
オプション説明
コードのヒント
- フォーマットは可読性を向上させますが、Javaコードのコンパイルや型チェックは行いません。編集後に通常のビルドやIDEチェックを実行してください。
- Javaソースの圧縮は本番ビルドではあまり有用ではありません。レビュー、スタックトレース、将来の保守のために読みやすいフォーマットを保ちましょう。
利用シーン
仕組み
Java のフォーマットは字句解析と AST 構築に基づいています。レキサーはソースを文字ごとにスキャンし、トークンを生成します。キーワード(class、public、static などの予約語)、識別子(変数名やクラス名)、リテラル(数値、文字列、文字)、演算子(+、-、==、&& 等)、区切り子({ } ( ) ; ,)、コメント(//、/* */)です。 パーサーは Java 言語仕様に従ってトークンストリームを抽象構文木(AST)に変換し、クラス定義、メソッド本体、ステートメントブロック、制御フロー構造、アノテーション、その他の構文単元を認識します。フォーマッターは AST をウォークし、Google Java Style などのスタイルガイドに従ってコードを再生成します。インデントはブロックの深さに応じて増加し、行幅は 100 カラムで制限され、演算子の両側にスペースが入り、カンマの後にスペースが入り、開き中括弧は同じ行に配置されます(K&R スタイル)。 アノテーションの処理は Java フォーマットにおける特殊なケースです。単一のアノテーションはメソッドと同じ行に残され、より長いアノテーションリストはパラメータに揃えて行に分割され、各アノテーションは独自の行に配置されます。
- 字句解析:50 の Java キーワード、識別子、リテラル、演算子、コメントを認識し、トークンストリームを出力します。
- AST 構築:JLS ルールに従い、クラス、メソッド、制御フロー、ラムダ、try-with-resources を正しく処理して AST を構築します。
- インデントルール:Google スタイルではデフォルトで 1 レベルあたり 4 スペース、行幅は 100 カラム。制限を超える行は自動的に折り返されます。
- 改行戦略:長いメソッドチェーン、パラメータリスト、アノテーションはカンマやドットで折り返され、継続行は前行の先頭文字に揃えられます。
- アノテーション処理:単一のアノテーションは同じ行に残され、複数のアノテーションは 1 行にまとめるか 1 行 1 つにするか、長さとパラメータ整列ルールで決定されます。
- コメント保持:// と /* */ コメントは元の位置に保持されます。圧縮時は削除もオプションとして選択可能です。
使用例
クラス定義のフォーマット
入力: public class User{private Long id;private String name;public User(Long id,String name){this.id=id;this.name=name;}}
出力:
public class User {
private Long id;
private String name;
public User(Long id, String name) {
this.id = id;
this.name = name;
}
}メソッドチェーンのフォーマット
入力: List<String> result=list.stream().filter(s->s.startsWith("a")).map(String::toUpperCase).sorted().collect(Collectors.toList());
出力:
List<String> result = list.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());アノテーションの折り返し
入力: @Override public ResponseEntity<User> getUser(@PathVariable Long id,@RequestParam(defaultValue="10") int size){...}
出力:
@Override
public ResponseEntity<User> getUser(
@PathVariable Long id,
@RequestParam(defaultValue = "10") int size) {
...
}よくある質問
どのJavaスタイルを使用していますか?
一般的なデフォルトはGoogle Java StyleまたはSun/Oracle規約です。インデント4スペース、K&Rのブレーススタイル、100カラム幅などです。一部のビルドではスタイルを切り替えるオプションが提供されています。スタイルガイドの細かいルールは微妙なので、フォーマッターを実行し、出力を読んで、設定を固定するのが良いでしょう。
フォーマッターは最新のJavaを理解しますか?
パーサーのバージョンによります。レコード、シールクラス、switch式、テキストブロック、パターンマッチングは最近追加された機能で、古いパーサーは対応できないことがあります。スニペットを試してみて、きれいにフォーマットされれば問題ありません。エラーが出る場合はパーサーのバージョンを確認してください。
インポートや未使用変数を整理してくれますか?
いいえ。フォーマットは空白とブレースの配置のみを変更します。静的解析(インポートの整理、未使用の削除)には、本格的なIDEや、google-java-formatの--skip-removing-unused-imports offのようなツールが必要です。
ソースコードはアップロードされますか?
いいえ。フォーマットはJSベースのJavaパーサーを使ってブラウザ内で実行されます。コードは送信されません。社内のセキュリティポリシーがWebツールへの暴露を禁じている場合は、独自コードの貼り付けを避けてください。
IntelliJやEclipseの出力と一致しますか?
完全に一致することはまずありません。各IDEには数千のオプションを持つ独自のフォーマッターがあります。アドホックなフォーマット用にこのツールを使い、チームでの一貫性のためには、ビルドに組み込まれたgoogle-java-formatやSpotlessなどCIで強制可能なツールを使用してください。
Javaをミニファイできますか?
Javaはコンパイル言語であり、JSのようなミニファイは適用されません。クラスファイルの最適化はビルド時にコンパイラとProGuardが行うものです。このページはあくまでソースレベルのフォーマット用です。
コードに余分な空行が追加されるのはなぜですか?
多くのスタイルガイドでは、クラスメンバー間やメソッド間に空行を要求します。フォーマッターはこれに準拠するために挿入します。コンパクトなコードを好む場合は、関連するスタイルオプションを上書きしてください。