Java | 基礎文法:三項演算子

Java Java
スポンサーリンク

三項演算子の全体像

三項演算子(条件演算子)は「条件に応じて値を一つ選ぶ」ための最短記法です。書式は 条件 ? 真のときの値 : 偽のときの値if-else を1行で「値として」書けるのが強みで、変数代入、メソッド引数、出力文の中など「式が必要な場所」で使えます。条件は必ず boolean で、戻り値は左右(?: の後ろ)の型から決まります。


基本形と動き

最小の書式と例

int score = 75;
String label = (score >= 60) ? "合格" : "不合格";
System.out.println(label); // 合格
Java

「条件を評価 → 真なら左、偽なら右」を選び、その「選ばれた値」が式の結果になります。if-else と違い、ブロックではなく「値」を返すため、代入やメソッド呼び出しで使いやすいのが特徴です。

ネストの基本(ただし慎重に)

int score = 85;
String grade = (score >= 90) ? "A"
               : (score >= 80) ? "B"
               : (score >= 70) ? "C"
               : (score >= 60) ? "D"
               : "F";
Java

短く書けますが、読みづらくなりやすいので「段階が多いなら if-else へ戻す」判断が重要です。


よく使う場面とコツ

Null 代替(デフォルトに置き換え)

String name = null;
String safe = (name != null) ? name : "unknown";
Java

null を安全な既定値へ置き換える定番パターンです。Java 8 以降なら Objects.requireNonNullElse も選択肢ですが、三項演算子は最小限の依存で済みます。

短い条件付き出力・代入

int n = 3;
System.out.println((n % 2 == 0) ? "even" : "odd");

double price = 1000;
double finalPrice = (price > 500) ? price * 0.9 : price; // 500 超なら10%引き
Java

「値だけ選びたい」場面に向いており、副作用(代入やログ)を伴う複雑処理は if-else に任せたほうが読みやすいです。


重要ポイントの深掘り:型決定と優先順位

返り値の型の決まり方(数値の昇格・共通型)

左右の式は「共通型」に揃えられます。数値なら通常の数値昇格のルールが働き、文字列や参照型なら共通の親型に収束します。無理な組み合わせはコンパイルエラーになります。

int a = 10;
double b = 2.5;
double r = (a > 5) ? a : b;   // r は double(数値昇格)
Java

同じ型に統一するほうが、意図が明確で予期せぬ型変換を避けられます。明示キャストで意図を示すのも安全策です。

int a = 10;
int r = (a > 5) ? a : (int) Math.round(2.5);
Java

優先順位と括弧

三項演算子は「代入より強い」「論理演算子より弱い」など、優先順位に癖があります。読み誤りを防ぐため、基本的に「全体を括弧」で包む習慣を持つと安全です。

int x = 3;
// 読みやすさ優先
int y = (x > 0) ? 1 : -1;
Java

重要ポイントの深掘り:可読性と副作用の扱い

式は「値の選択」に限る

三項演算子の左右に複雑な処理(代入、メソッド呼び出し、ログなど)を詰め込むと、意図が読みにくくバグの温床になります。値選択に限定し、処理は if-else で書くのがプロの設計です。

// 悪い例:副作用を混ぜて読みづらい
int r = cond ? doSideEffectAndReturn() : otherSideEffect();

// 良い例:副作用は分離し、値選択は短く
int v1 = prepare1();
int v2 = prepare2();
int r = cond ? v1 : v2;
Java

ネストは「2段まで」目安

三項演算子の入れ子は2段程度までなら追えますが、それ以上は if-else へ切り替えます。「未来の自分が一読で理解できるか」を基準に判断しましょう。


例題で身につける

例 1: 文字列が空なら代替を使う

public class DefaultString {
    public static void main(String[] args) {
        String nick = "";
        String shown = (!nick.isBlank()) ? nick : "名無し";
        System.out.println(shown); // 名無し
    }
}
Java

例 2: 送料の条件選択

public class Shipping {
    public static void main(String[] args) {
        int total = 480;
        int fee = (total >= 500) ? 0 : 200;
        System.out.println("fee=" + fee); // 200
    }
}
Java

例 3: 列挙と文字列ラベル

enum Status { OK, NG }
public class Label {
    public static void main(String[] args) {
        Status s = Status.OK;
        String label = (s == Status.OK) ? "成功" : "失敗";
        System.out.println(label);
    }
}
Java

設計の指針(重要部分のまとめ)

  • 「値だけを選ぶ」場面で使い、処理は if-else に分離する。副作用は混ぜない。
  • 型は左右で揃えるか、明示キャストで意図を示す。数値昇格・共通型の自動変換を理解する。
  • 括弧で全体を包み、優先順位の誤読を防ぐ。ネストは2段までを目安に。
  • null 代替、短い条件付き代入・出力、簡単なラベル付けに最適。複雑なら迷わず if-else

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