【Java学習|豆知識】Javaの制御フローをモダンに!if-elseからsealed classesまで使いこなす技術

導入

Javaのコーディングにおいて、条件分岐は避けて通れない基本です。しかし、古いスタイルのif-else文を漫然と使い続けると、コードは複雑化し、保守性が低下します。本記事では、Java 17以降で標準となったモダンな制御フローを駆使し、堅牢で読みやすいコードを書くためのTipsを紹介します。

基礎知識

Javaの条件分岐には、伝統的なif-else文のほか、より宣言的で安全なswitch expressions(switch式)があります。さらに、これらと相性が抜群なのがsealed classes(シールクラス)です。シールクラスを使うと、「どのサブクラスが存在するか」をコンパイラが完全に把握できるため、網羅性の高い(漏れのない)コードを書くことが可能になります。

実装/解決策

複雑なif-elseの連鎖を避けるために、以下のステップを意識しましょう。
1. 網羅性の確保: switch式を利用し、default節を最小限にする。
2. 副作用の回避: 代入を目的とする場合は、if文ではなくswitch式(値を返す)を使用する。
3. 型による分岐: sealed classesとパターンマッチングを組み合わせ、型に応じた処理を強制させる。

サンプルプログラム

以下のコードは、シールクラスを用いて、型に基づいた安全な計算処理を行う例です。


// sealedクラスにより、継承可能なクラスを制限します
sealed interface Shape permits Circle, Rectangle {}

record Circle(double radius) implements Shape {}
record Rectangle(double width, double height) implements Shape {}

public class ShapeProcessor {
public double getArea(Shape shape) {
// switch式を使用。網羅性がチェックされるため安全です
return switch (shape) {
case Circle c -> Math.PI c.radius() c.radius();
case Rectangle r -> r.width() r.height();
// sealedクラスの場合、すべての型を網羅すればdefault節は不要です
};
}

public static void main(String[] args) {
Shape shape = new Circle(5.0);
System.out.println("面積は: " + new ShapeProcessor().getArea(shape));
}
}

応用・注意点

現場での開発において特に重要なのは「網羅性(Exhaustiveness)」です。従来のswitch文では、新しい型を追加した際にcaseを書き忘れてもコンパイルエラーになりませんが、sealed classesswitch式を組み合わせることで、型を追加した瞬間にコンパイルエラーが発生し、「修正漏れ」を物理的に防ぐことができます。

また、yieldキーワードはswitch式の中で複雑な処理を行いたい場合に使います。単なる値の返却ではなく、ブロック内でロジックを組む必要がある際に非常に強力です。ただし、過度なロジックを詰め込みすぎると可読性が下がるため、複雑な計算は別メソッドに切り出すのがシニアエンジニアとしての賢い設計です。

コメント

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