Java Tips | 文字列処理:先頭大文字化

Java Java
スポンサーリンク

先頭大文字化は「ちょっとだけ“きれいな名前・ラベル”にする」技

キャメルケースやスネークケースほど大げさではないけれど、
業務で地味によく出てくるのが 「先頭だけ大文字にしたい」 というニーズです。

userUser
errorError
internal server errorInternal server error

画面に出すラベル、ログメッセージの先頭、クラス名や Enum 名を生成するときなど、
「全部を整形するほどではないけど、先頭くらいは整えておきたい」という場面で効いてきます。


基本の考え方:「先頭1文字」と「残り全部」を分けて扱う

文字列を「head」と「tail」に分解するイメージ

先頭大文字化の本質は、とてもシンプルです。

1文字目(head)を取り出す。
それを大文字にする。
2文字目以降(tail)はそのまま残す。
head + tail を連結する。

この「head と tail に分ける」という感覚を持っておくと、
null や空文字、1文字だけの文字列などの扱いも自然に整理できます。


実装:英字の先頭1文字だけを大文字にするユーティリティ

Locale を明示して「英語としての大文字化」をする

まずは、英字の先頭1文字だけを大文字にする、いちばん基本のユーティリティです。

import java.util.Locale;

public final class Capitalizer {

    private Capitalizer() {}

    public static String capitalizeFirst(String text) {
        if (text == null || text.isEmpty()) {
            return text;
        }
        if (text.length() == 1) {
            return text.toUpperCase(Locale.ROOT);
        }
        char first = text.charAt(0);
        String head = String.valueOf(first).toUpperCase(Locale.ROOT);
        String tail = text.substring(1);
        return head + tail;
    }
}
Java

使い方はこうなります。

System.out.println(Capitalizer.capitalizeFirst("user"));   // User
System.out.println(Capitalizer.capitalizeFirst("error"));  // Error
System.out.println(Capitalizer.capitalizeFirst("a"));      // A
System.out.println(Capitalizer.capitalizeFirst(""));       // ""
System.out.println(Capitalizer.capitalizeFirst(null));     // null
Java

ここで深掘りしたい重要ポイントは二つです。

一つ目は、「先頭1文字だけを toUpperCase(Locale.ROOT) している」ことです。
Locale.ROOT を使うことで、環境のロケールに引きずられない、安定した大文字化になります。

二つ目は、「null と空文字、1文字だけの文字列をちゃんと分けて扱っている」ことです。
null はそのまま null、空文字はそのまま空文字、1文字だけならそれを大文字にして返す――
こうしておくと、呼び出し側で余計な null チェックや長さチェックを書かずに済みます。


例題:画面ラベルの「先頭だけ」整える

user name → User name のように、軽く整形したい

画面に出すラベルやメッセージで、
「全部をタイトルケースにするほどではないけど、先頭くらいは整えたい」ということがあります。

public final class Labels {

    private Labels() {}

    public static String capitalizeLabel(String label) {
        if (label == null) {
            return "";
        }
        String trimmed = label.trim();
        return Capitalizer.capitalizeFirst(trimmed);
    }
}
Java

使い方はこうです。

System.out.println(Labels.capitalizeLabel("user name"));          // User name
System.out.println(Labels.capitalizeLabel("  internal error "));  // Internal error
System.out.println(Labels.capitalizeLabel(null));                 // ""
Java

ここでのポイントは、「トリム+先頭大文字化という“ラベル用の前処理セット”をユーティリティに閉じ込めている」ことです。
画面ラベルの整形ルールを一箇所にまとめておくと、
あとから「先頭も小文字にしたい」「全部大文字にしたい」といった仕様変更にも対応しやすくなります。


例題:Enum 名やクラス名を生成するときに使う

user → User をクラス名の一部にしたい

コード生成ツールや簡易スクリプトで、
user という文字列から UserDtoUserRequest のようなクラス名を作りたいことがあります。

public final class NameGenerator {

    private NameGenerator() {}

    public static String toClassName(String base) {
        if (base == null || base.isEmpty()) {
            throw new IllegalArgumentException("base must not be empty");
        }
        String head = Capitalizer.capitalizeFirst(base);
        return head + "Dto";
    }
}
Java

使い方はこうです。

System.out.println(NameGenerator.toClassName("user"));   // UserDto
System.out.println(NameGenerator.toClassName("order"));  // OrderDto
Java

ここでのポイントは、「“クラス名用”という文脈をユーティリティ名に刻んでいる」ことです。
中身は先頭大文字化+サフィックス付与という単純な処理ですが、
toClassName という名前がついているだけで、「これはクラス名を作るためのルールなんだな」と一目で分かります。


例題:「単語ごと」ではなく「文字列全体の先頭だけ」を大文字にする

タイトルケースとの違いを意識する

よくある勘違いが、「先頭大文字化」と「タイトルケース(単語ごとに先頭大文字)」をごっちゃにしてしまうことです。

先頭大文字化(今やっているもの)
internal server errorInternal server error

タイトルケース
internal server errorInternal Server Error

もし「単語ごとに先頭を大文字にしたい」なら、
スペースで split して、各単語に capitalizeFirst を適用してから連結する、という別のユーティリティが必要になります。

ここで大事なのは、「“文字列全体の先頭だけ”を大文字にするのか、“単語ごと”に大文字にするのかを、メソッド名と実装で明確に分ける」ことです。
capitalizeFirst は前者、capitalizeWords のような別メソッドを作るならそれは後者、といった具合に整理しておくと、
後から読んだときに混乱しません。


まとめ:先頭大文字化ユーティリティで身につけたい感覚

先頭大文字化は、「文字列をフルで整形するほどではないけれど、最低限の“きれいさ”を足したい」ときに使う、小さなけれど便利な技です。

押さえておきたい感覚は、まず「文字列を head(先頭1文字)と tail(残り)に分けて考える」こと。
次に、「toUpperCase(Locale.ROOT) を使って、ロケールに依存しない安定した大文字化をする」こと。
そして、「ラベル用・クラス名用など、文脈ごとのルール(トリムするか、null をどう扱うかなど)を薄いラッパーメソッドとしてユーティリティに閉じ込める」ことです。

もしあなたのコードのどこかに、s.substring(0, 1).toUpperCase() + s.substring(1) のような断片が散らばっているなら、
それを題材にして、ここで作った CapitalizerLabelsNameGenerator のようなユーティリティにまとめてみてください。
それだけで、「読みやすくて、再利用できて、仕様変更にも強い“ちょっとした文字列整形”」に、一段レベルアップできます。

タイトルとURLをコピーしました