三項演算子の全体像
三項演算子(条件演算子)は「条件に応じて値を一つ選ぶ」ための最短記法です。書式は 条件 ? 真のときの値 : 偽のときの値。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";
Javanull を安全な既定値へ置き換える定番パターンです。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。
