<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/category/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Wed, 07 May 2025 05:17:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>Java | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Java】列挙型(enum)を１からわかりやすく</title>
		<link>https://it-biz.online/java/enum/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9438</guid>

					<description><![CDATA[列挙型（enum）とは、あらかじめ決められた選択肢の中から１つを選ぶ必要がある場面で使用される特別なデータ型です。Javaではenumをうまく活用すると、コーディングミスの防止や可読性の向上、コード全体の保守性を高めるこ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>列挙型（<code><span class="bold-blue">enum</span></code>）とは、あらかじめ決められた選択肢の中から１つを選ぶ必要がある場面で使用される特別な<a href="https://it-biz.online/it-skills/data_type/">データ型</a>です。Javaでは<code><span class="blue">enum</span></code>をうまく活用すると、コーディングミスの防止や可読性の向上、コード全体の保守性を高めることができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">enum Season {
    SPRING, SUMMER, FALL, WINTER;
}
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「曜日」「四季」のように、<strong>選択肢が限られているものを表現するために使用される</strong>ため、<code>enum</code>は<em>「選択肢の管理者」</em>のような役割を果たします。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">+---------------------+
|       enum Day      |  &lt;-- 列挙型 (enum)
+---------------------+
| - MONDAY            |  &lt;-- 定数1
| - TUESDAY           |  &lt;-- 定数2
| - WEDNESDAY         |  &lt;-- 定数3
| - THURSDAY          |  &lt;-- 定数4
| - FRIDAY            |  &lt;-- 定数5
| - SATURDAY          |  &lt;-- 定数6
| - SUNDAY            |  &lt;-- 定数7
+---------------------+</pre>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Javaの列挙型（enum）とは？</a><ol><li><a href="#toc2" tabindex="0">enumを使わない場合の問題</a></li></ol></li><li><a href="#toc3" tabindex="0">enumの基本的な使い方：構文ルール</a><ol><li><a href="#toc4" tabindex="0">enumの活用例</a></li></ol></li><li><a href="#toc5" tabindex="0">enumの応用例</a><ol><li><a href="#toc6" tabindex="0">enumにメソッドを追加する</a></li></ol></li><li><a href="#toc7" tabindex="0">enumの内部動作</a><ol><li><a href="#toc8" tabindex="0">1. enumがクラスとして実装されるとは？</a></li><li><a href="#toc9" tabindex="0">2. シングルトンパターンの適用</a></li><li><a href="#toc10" tabindex="0">3. ==演算子による比較の正しさ</a></li></ol></li><li><a href="#toc11" tabindex="0">実務でのenumの活用例</a><ol><li><a href="#toc12" tabindex="0">プロジェクトの進捗状況の管理</a></li><li><a href="#toc13" tabindex="0">switch文との連携</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Javaの列挙型（enum）とは？</span></h2>



<p><code>enum</code>は、<strong><span class="marker-under">決まった範囲の値</span></strong>を１つの型としてまとめる役割を持つデータ型の一種（厳密には<code><span class="blue">java.lang.Enum</span></code>を継承した<a href="https://it-biz.online/java/java-oop/">クラス</a>として扱われます）。</p>



<p>具体的な例として、曜日（<code>MONDAY</code>、<code>TUESDAY</code>）や四季（<code>SPRING</code>、<code>SUMMER</code>）を扱う際に便利なデータ型です。</p>



<p><strong>例え話</strong>：レストランの注文で・・・</p>



<ul class="wp-block-list">
<li>レストランでは「ラーメン」「カレー」「ハンバーグ」など、メニューから選んで注文します。これ以外の注文が来ても対応できません。同様に、<code>enum</code>を使えば、プログラム内で定義した選択肢以外の無効な値を防ぐことができます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc2">enumを使わない場合の問題</span></h3>



<p>選択肢を文字列（<code><a href="https://it-biz.online/java/java-string/">String</a></code>）で扱う場合、タイプミスや異なる表記によるエラーが発生しやすくなります。以下の例を見てください。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Stringを使った例（エラーの原因）
String day = "Mondai"; // スペルミスによるバグ

// enumを使った例（安全）
Day day = Day.MONDAY; // 決まった選択肢だけが使用可能
</pre>



<p>要するに<strong>タイプミスやコーディングミスを制限するために役立つ</strong>のが<code>enum</code>のもう１つの側面でもあります。</p>



<h2 class="wp-block-heading"><span id="toc3">enumの基本的な使い方：構文ルール</span></h2>



<p>以下のように、Javaの<code>enum</code>は特定の選択肢を<strong>定数として宣言</strong>します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
</pre>



<p><span class="badge-green">ポイント</span>　<strong>enumの基本的な性質：不変性</strong></p>



<ul class="wp-block-list">
<li><strong>要素の追加・削除不可</strong>：<code>enum</code>の宣言後に要素を追加したり削除することはできません。</li>



<li><strong>要素の再代入不可</strong>：プログラムの実行中に<code>enum</code>の要素を新しい値に変更することはできません。</li>



<li><strong>定数はすべて暗黙的に<code>final</code>かつ<code>static</code></strong>：そのため、インスタンス化も変更もできません。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

// 以下のコードはコンパイルエラーになる
Day today = Day.MONDAY;
// today = "Holiday"; // エラー: 型が一致しない</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>※<code>enum</code>の要素は<code><span class="bold-blue">型名.要素名</span></code>で呼び出します（例：<code>Day.MONDAY</code>）。</p>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-question-circle"><span class="tab-caption-box-label-text block-box-label-text box-label-text">なぜenumは書き換えられないのか？</span></div><div class="tab-caption-box-content block-box-content box-content">
<p><strong>理由1：不変性による安全性</strong></p>



<ul class="wp-block-list">
<li><code>enum</code>を使うことで、<strong>プログラムが予期せぬ変更を受けない</strong>ようにすることができます。<br>例：曜日が動的に変わることは現実的にないため、不変性が理にかなっています。</li>
</ul>



<p><strong>理由2：メモリの効率化</strong></p>



<ul class="wp-block-list">
<li><code>enum</code>の各要素はJavaによって<strong>シングルトン（Singleton）</strong>として管理され、1つのインスタンスが再利用されます。そのため、新たなインスタンスを作成したり、既存の要素を書き換える必要がありません。</li>
</ul>
</div></div>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-memo block-box">
<p><code>enum</code>（列挙型）はクラスの一種です。実際、<code>enum</code>を定義するとコンパイラは<code>java.lang.Enum</code>を<a href="https://it-biz.online/java/java-extends/">継承</a>したクラスとして扱います。例えば以下のように定義すると・・・</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public enum Color { RED, GREEN, BLUE; }
</pre>



<p>これはコンパイラによって下記のようなクラスに変換されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public final class Color extends java.lang.Enum&lt;Color> {
    public static final Color RED = new Color("RED", 0);
    public static final Color GREEN = new Color("GREEN", 1);
    public static final Color BLUE = new Color("BLUE", 2);
    private static final Color[] $VALUES = { RED, GREEN, BLUE };

    private Color(String name, int ordinal) {
        super(name, ordinal);
    }

    public static Color[] values() {
        return $VALUES.clone();
    }

    public static Color valueOf(String name) {
        return Enum.valueOf(Color.class, name);
    }
}
</pre>



<ul class="wp-block-list">
<li><code>extends Enum&lt;Color&gt;</code>：共通処理（<code>name()</code>, <code>ordinal()</code>, <code>compareTo()</code>など）を<code>Enum</code>クラスから継承。</li>



<li>定数ごとに<code>new Color("NAME", 番号)</code>でインスタンス化。</li>



<li><code>$VALUES</code>配列で全定数を保持。</li>
</ul>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>基底クラス<code>java.lang.Enum</code>の役割</strong>
<ul class="wp-block-list">
<li><strong><code>name()</code></strong>: 定数の文字列表現</li>



<li><strong><code>ordinal()</code></strong>: 宣言順の添字</li>



<li><strong><code>compareTo()</code></strong>: 宣言順比較</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>toString()</code></strong>: デフォルトで<code>name()</code>を返す</li>
</ul>
</li>



<li><strong>自動生成される静的メソッド</strong>
<ul class="wp-block-list">
<li><strong><code>values()</code></strong>: <code>$VALUES</code>を<code>clone()</code>して返却（外部から配列を書き換えられないように）</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>valueOf(String)</code></strong>: 名前一致で定数を取得。存在しないと<code>IllegalArgumentException</code>を投げる。</li>
</ul>
</li>



<li><strong>ユーザー定義の要素</strong>
<ul class="wp-block-list">
<li>独自フィールドやメソッドを<code>enum</code>内に記述可能。</li>



<li>たとえば、<code>RED(255,0,0)</code>のようにコンストラクタ引数を持たせ、RGB値を保持できる。</li>
</ul>
</li>
</ol>



<p><span class="badge-green">ポイント</span>　<strong>enumの特徴まとめ</strong></p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>説明</th></tr></thead><tbody><tr><td>クラスの一種</td><td><code>Enum</code>は内部的にはクラス（ただし継承はできない）</td></tr><tr><td>固定値の集合</td><td>決まった値（定数）を列挙するのに使う</td></tr><tr><td>メソッド定義可能</td><td>メソッドやフィールドを追加できる</td></tr><tr><td>インスタンス生成</td><td>自動で定義された値分だけ生成され、<code>new</code>で追加は不可</td></tr></tbody></table></div></figure>
</div>



<h3 class="wp-block-heading"><span id="toc4">enumの活用例</span></h3>



<p><code>enum</code>の要素は<strong>定数（<a href="https://it-biz.online/java/java-static/">static</a>なインスタンス）として定義されているので</strong>、<strong>クラス名.要素名</strong>の形で呼び出せます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 列挙型(enum)の定義
enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public class EnumExample {
    public static void main(String[] args) {
        // 今日の曜日を設定
        Day today = Day.MONDAY;

        // 曜日に応じた条件分岐
        if (today == Day.MONDAY) {
            System.out.println("今日は月曜日です！");
        } else {
            System.out.println("今日は月曜日ではありません。");
        }
    }
}
</pre>



<p><strong>出力例:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">今日は月曜日です！
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><strong><span class="marker-under">enumもクラスの一種！そして、enumの各定数は<strong>自動的にstatic finalなインスタンスとして生成される</strong>！</span></strong></p>



<p>という点だけ頭に入れておけば基本的には自由に使いこなすことができるはずです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">enumの応用例</span></h2>



<p>ここからは、enumの応用編です。より実践に近づけながら解説します。</p>



<h3 class="wp-block-heading"><span id="toc6">enumにメソッドを追加する</span></h3>



<p><code>enum</code>は定数の集合だけでなく、<strong><span class="marker-under">メソッドを持たせることで、より柔軟な使い方が可能</span></strong>です。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/java/java-method/">メソッドとは？</a></p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><code>enum</code>にメソッドを持たせる理由はなんでしょうか？</p>
</div></div>



<p>例えば「四季」や「状態」を表す<code>enum</code>があったとしましょう。各季節に「気候の説明」を持たせたい場合、ただの定数ではそれを表現するのは難しいです。ここで、<strong>メソッド</strong>を使えば、それぞれの要素に必要な情報を持たせ、簡単に取得できるようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// enumの定義：四季に説明を持たせる
enum Season {
    SPRING("暖かい"), 
    SUMMER("暑い"), 
    FALL("涼しい"), 
    WINTER("寒い");

    private final String description; // 各要素の説明を保持するフィールド

    // コンストラクタ：各要素を初期化
    Season(String description) {
        this.description = description;
    }

    // 説明を取得するメソッド
    public String getDescription() {
        return description;
    }
}

public class EnumMethodExample {
    public static void main(String[] args) {
        // SUMMERの説明を取得
        Season currentSeason = Season.SUMMER;
        System.out.println("今の季節は " + currentSeason + " で、" + currentSeason.getDescription() + "です。");
    }
}
</pre>



<p><strong>出力結果</strong>：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">今の季節は SUMMER で、暑いです。
</pre>



<h2 class="wp-block-heading"><span id="toc7">enumの内部動作</span></h2>



<p><code>enum</code>は、内部的にクラス（<span class="badge">参考</span>　<a href="https://it-biz.online/java/java-oop/">クラスとは？</a>）として実装され、各要素はシングルトンインスタンスとして生成されます。つまり、同じ<code>enum</code>要素を比較する際に<code><span class="bold-blue">==</span></code>を使うことができ、常に正しい比較が保証されます。</p>



<h3 class="wp-block-heading"><span id="toc8">1. enumがクラスとして実装されるとは？</span></h3>



<p>Javaでは、<code>enum</code>はコンパイル時に<strong>特別なクラス</strong>として変換されます。これは、各<code>enum</code>要素が通常のクラスインスタンスとして扱われるという意味です。しかし、開発者が自分でインスタンスを生成したり変更することはできません。</p>



<h4 class="wp-block-heading"><strong>enumの内部クラス構造イメージ</strong></h4>



<p>以下は、<code>enum</code>が内部的にどのような形でクラスとして扱われるかをイメージ化したものです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 実際にはJavaコンパイラによってこのようなクラスに変換される
public final class Day extends Enum&lt;Day> {
    public static final Day MONDAY = new Day("MONDAY", 0);
    public static final Day TUESDAY = new Day("TUESDAY", 1);
    // 他の曜日も同様に定義

    private Day(String name, int ordinal) {
        super(name, ordinal);
    }
}
</pre>



<h3 class="wp-block-heading"><span id="toc9">2. シングルトンパターンの適用</span></h3>



<ul class="wp-block-list">
<li><strong>シングルトンパターン</strong>は、あるクラスのインスタンスが<strong>1つだけ存在することを保証</strong>するデザインパターンです。</li>



<li><code>enum</code>では、このシングルトンの特性が<strong>自動的に適用</strong>されます。</li>
</ul>



<h4 class="wp-block-heading"><strong>enum要素はシングルトン</strong></h4>



<p><code>enum</code>の各要素（例：<code>MONDAY</code>、<code>TUESDAY</code>）は、プログラム全体で<strong>一度だけ生成されるインスタンス</strong>です。これにより、同じ要素同士を比較するときに<strong><code>==</code>演算子</strong>を使って正しく比較できるのです。</p>



<h3 class="wp-block-heading"><span id="toc10">3. ==演算子による比較の正しさ</span></h3>



<p>通常、Javaでは<code>==</code>演算子は<strong>オブジェクトの同一性（同じインスタンスかどうか）</strong>をチェックします。例えば、<code>new</code>キーワードで作成したオブジェクト同士を<code>==</code>で比較すると、異なるインスタンスなので<code>false</code>になります。</p>



<p><strong>例：<code>new</code>で作成したオブジェクトの比較</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);  // false
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記の例では、<code>a</code>と<code>b</code>は同じ内容でも、異なるインスタンスなので<code>false</code>になります。</p>
</div></div>



<p><strong>enumでの比較</strong></p>



<p>しかし、<code>enum</code>の場合、各要素はシングルトンとして管理されているため、同じ<code>enum</code>要素は常に<strong>同じインスタンス</strong>です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
System.out.println(day1 == day2);  // true
</pre>



<p><span class="badge-green">ポイント</span>　<strong>enumの内部動作</strong></p>



<ul class="wp-block-list">
<li>各要素は<code>static final</code>なインスタンスとして扱われます。</li>



<li>Javaコンパイラは<code>enum</code>をクラスとして変換し、最適化します。</li>



<li><code>ordinal()</code>メソッドを使うと、要素のインデックスを取得できますが、順序に依存しない設計が推奨されます。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc11">実務でのenumの活用例</span></h2>



<h3 class="wp-block-heading"><span id="toc12">プロジェクトの進捗状況の管理</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public enum Status {
    PENDING, IN_PROGRESS, COMPLETED
}
</pre>



<p>プロジェクトの進捗を管理する際、<code>enum</code>を使って状態を表現することで、管理を簡潔にします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Status projectStatus = Status.IN_PROGRESS;
if (projectStatus == Status.COMPLETED) {
    System.out.println("プロジェクトが完了しました！");
}
</pre>



<h3 class="wp-block-heading"><span id="toc13">switch文との連携</span></h3>



<p><code>switch</code>文(<span class="badge">参考</span>　<a href="https://it-biz.online/java/java-switch/">switch文の基本</a>)と<code>enum</code>の組み合わせは、条件分岐を簡潔かつ可読性高く実装するのに有効です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class EnumSwitchExample {
    public static void main(String[] args) {
        Day day = Day.FRIDAY;

        switch (day) {
            case MONDAY:
                System.out.println("仕事が始まる日");
                break;
            case FRIDAY:
                System.out.println("週末の前日！");
                break;
            default:
                System.out.println("平日");
        }
    }
}
</pre>



<p><strong>出力例:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">週末の前日！
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>Javaのenum（列挙型）</strong></p>



<p><strong>1. enumの基本的な特徴</strong></p>



<ul class="wp-block-list">
<li><strong>定数の集合を管理</strong>：<code>enum</code>は、関連する定数を１つの型にまとめます（例：曜日、季節など）。</li>



<li><strong>変更不可（不変性）</strong>：<code>enum</code>は宣言後に変更できず、安全なプログラムの作成に役立ちます。</li>



<li><strong>コンパクトで可読性の高いコード</strong>を実現：<code>enum</code>の要素は<code>if</code>文や<code>switch</code>文で簡潔に使えます。</li>
</ul>



<p><strong>2. enumの使い方</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

Day today = Day.MONDAY;
if (today == Day.MONDAY) {
    System.out.println("今日は月曜日です！");
}
</pre>



<ul class="wp-block-list">
<li><strong><code>==</code>演算子</strong>で要素を比較でき、<code>equals()</code>を使う必要がありません。</li>



<li><strong>型安全性</strong>を保証し、無効な値が使われるのを防ぎます。</li>
</ul>



<p><strong>3. enumの内部構造と特性</strong></p>



<ul class="wp-block-list">
<li><strong>クラスとして実装される</strong>：Javaコンパイラは<code>enum</code>を内部的に<strong>クラス</strong>に変換します。</li>



<li><strong>シングルトンインスタンス</strong>：<code>enum</code>の各要素は<strong>一度だけ生成され、プログラム全体で共有される</strong>インスタンスです。</li>



<li><strong><code>==</code>で比較可能</strong>：同じ<code>enum</code>要素は同一のインスタンスを指すため、<code>==</code>での比較が安全です。</li>
</ul>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JSPファイル超入門 – 0 → 現場で“JSPの人”になるまで</title>
		<link>https://it-biz.online/web-design/html/java-server-pages/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 06 May 2025 05:51:29 +0000</pubDate>
				<category><![CDATA[HTML]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Web開発]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10372</guid>

					<description><![CDATA[JSP（Java Server Pages）は HTMLにJavaコードを差し込み、動的ページを生成する仕組み です。 まず最初にお伝えしたいのは、JSPは決して難しいものではありません。むしろ、「ちょっと動きのあるWe [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JSP（Java Server Pages）は <strong><a href="https://it-biz.online/web-design/html-basic/">HTML</a>にJavaコードを差し込み、動的ページを生成する仕組み</strong> です。</p>



<p>まず最初にお伝えしたいのは、<strong>JSPは決して難しいものではありません。</strong>むしろ、「ちょっと動きのあるWebページを、できるだけ簡単に作りたい！」という人のために生まれたものなのです。近年では他の技術に取って代わられた印象が否めないJSPですが、昔からある巨大なレガシーシステムなどでは現役で、システムの更改案件などではよく目にすることがあります。</p>



<p>このページでは「JSPってそもそも何？」という一番大事な部分から、初心者向けに順を追って１からわかりやすく専門用語を避けて解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">JSPとは何か？</a><ol><li><a href="#toc2" tabindex="0">【前提１】静的なページと動的なページ</a></li><li><a href="#toc3" tabindex="0">JSPとはどのような技術か</a></li><li><a href="#toc4" tabindex="0">JSPの動作のしくみ</a></li></ol></li><li><a href="#toc5" tabindex="0">JSPを動かすための準備</a><ol><li><a href="#toc6" tabindex="0">JSPの動作に必要なもの</a></li></ol></li><li><a href="#toc7" tabindex="0">最初のJSPファイルを作ってみよう</a><ol><li><a href="#toc8" tabindex="0">JSPファイルとはどんなファイルか</a></li><li><a href="#toc9" tabindex="0">ブラウザで表示してみる</a></li></ol></li><li><a href="#toc10" tabindex="0">JSPの基本構文</a><ol><li><a href="#toc11" tabindex="0">JSPの構成要素</a></li><li><a href="#toc12" tabindex="0">ディレクティブ</a></li><li><a href="#toc13" tabindex="0">スクリプトレット</a></li><li><a href="#toc14" tabindex="0">式（Expression）</a></li><li><a href="#toc15" tabindex="0">宣言</a></li><li><a href="#toc16" tabindex="0">コメントの書き方</a></li><li><a href="#toc17" tabindex="0">スクリプトレットはなるべく使わない</a></li></ol></li><li><a href="#toc18" tabindex="0">ELとJSTLでスクリプトレットのないJSPへ</a><ol><li><a href="#toc19" tabindex="0">EL（式言語）とは</a></li><li><a href="#toc20" tabindex="0">JSTL（JSP標準タグライブラリ）とは</a></li><li><a href="#toc21" tabindex="0">JSPをすっきり保つために</a></li></ol></li><li><a href="#toc22" tabindex="0">フォームからデータを受け取る</a><ol><li><a href="#toc23" tabindex="0">フォーム送信の流れ</a></li><li><a href="#toc24" tabindex="0">フォームを作るJSP（entry.jsp）</a></li><li><a href="#toc25" tabindex="0">データを受け取るJSP（result.jsp）</a></li><li><a href="#toc26" tabindex="0">ELを使って書き換える</a></li></ol></li><li><a href="#toc27" tabindex="0">セッションとCookieでデータを保持する</a><ol><li><a href="#toc28" tabindex="0">セッションの基本操作</a></li><li><a href="#toc29" tabindex="0">Cookieとは</a></li><li><a href="#toc30" tabindex="0">Cookieの基本操作</a></li><li><a href="#toc31" tabindex="0">セッションとCookieの使い分け</a></li></ol></li><li><a href="#toc32" tabindex="0">JSPで簡単なアンケートアプリを作ろう</a><ol><li><a href="#toc33" tabindex="0">アプリの構成と目的</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">JSPとは何か？</span></h2>



<p><strong>JSP（Java Server Pages）</strong>は、Javaを使ってWebページを動的に生成するための技術で、通常のHTMLファイルにJavaのコードを埋め込むことで、アクセスするたびに内容が変化するページを作成することを可能にします。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>そのため、JSPはJavaをベースとしていますが、HTMLの知識があれば、基本的な使い方は十分に理解することができます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">【前提１】静的なページと動的なページ</span></h3>



<p>Webページには、大きく分けて2種類あります。<br>1つは「<strong>静的なページ</strong>」、もう1つは「<strong>動的なページ</strong>」です。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/static-dynamic/" title="静的コンテンツ/動的コンテンツの違いを１分で解説【初心者向け】" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img fetchpriority="high" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2019/09/746394eb4d9cc08edc56e7be8fffc150-320x180.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2019/09/746394eb4d9cc08edc56e7be8fffc150-320x180.jpg 320w, https://it-biz.online/wp-content/uploads/2019/09/746394eb4d9cc08edc56e7be8fffc150-240x135.jpg 240w, https://it-biz.online/wp-content/uploads/2019/09/746394eb4d9cc08edc56e7be8fffc150-640x360.jpg 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">静的コンテンツ/動的コンテンツの違いを１分で解説【初心者向け】</div><div class="blogcard-snippet internal-blogcard-snippet">【初心者向け】「動的」「静的」という言葉の意味とその違いを端的に解説します。本で学習したがイマイチ理解できない、、、結局一言でいうと違いは何？という疑問をお持ちの方に具体例を用いながら分かりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.15</div></div></div></div></a>
</div></figure>



<p>静的なページとは、内容があらかじめ決まっていて、アクセスするたびに同じ内容が表示されるページです。たとえば、自己紹介だけが書かれた会社のホームページや、お知らせ一覧だけが載っているページなどが該当します。</p>



<p>一方、動的なページは、アクセスした時点の情報や、閲覧しているユーザーの状態に応じて内容が変わります。たとえば、ショッピングサイトで商品が表示されたり、ログイン中のユーザー名が画面に表示されたりするページがそうです。</p>



<p><strong><span class="marker-under">静的なページはHTMLだけで作成できますが、動的なページを作るには、プログラムによってページの内容を生成する仕組みが必要</span></strong>です。JSPは、そのような仕組みの一つです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>もちろんJSP以外にも同じようなことを実現することが可能で、現代ではほとんどJSP以外が主役です。なのですが、レガシーシステムでは今でも現役で動いていることが多いので「まあ知っておいて損はないかな」というのがJSPの位置づけです。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc3">JSPとはどのような技術か</span></h3>



<p>JSPは、<strong>JavaのコードをHTMLに埋め込むことで</strong>、Webサーバー上で動的にHTMLを生成する技術です。拡張子が <code><span class="blue">.jsp</span></code> であるファイルを使ってページを作成します。</p>



<p>JSPファイルは、<a href="https://it-biz.online/it-skills/web-server/">Webサーバー</a>（通常は<strong>Tomcat</strong>）に配置され、ユーザーがアクセスすると、サーバー側でJavaのコードが実行されます。その結果として生成されたHTMLが、ブラウザに送信され、画面に表示されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>つまり、JSPは「動的にHTMLを生成する仕組み」であり、「HTMLの中にJavaの処理を一部書き足せる形式のファイル」と言えます。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>JSPは、以下のような場面でよく利用されます。</p>



<ul class="wp-block-list">
<li>ユーザーの入力に応じて表示内容を変えたいとき</li>



<li>データベースから取得した情報を一覧表示したいとき</li>



<li>フォーム送信結果を別の画面に反映したいとき</li>



<li>ログインしたユーザーごとにページの表示内容を切り替えたいとき</li>
</ul>



<p>このような場合、HTMLだけでは対応が難しくなりますが、JSPを使えば、これらの処理をサーバー側で実現できます。</p>
</div>



<h3 class="wp-block-heading"><span id="toc4">JSPの動作のしくみ</span></h3>



<p>JSPファイルは、ユーザーがアクセスしたときに、サーバー側で一度「Javaのクラス（Servlet）」に変換されます。変換されたクラスはコンパイルされ、Javaプログラムとして実行されます。このとき、JSPファイルに書かれたHTMLの部分はそのままHTMLとして出力され、Javaのコード部分は処理されて結果が埋め込まれます。最終的に生成されたHTMLがブラウザに送信され、ユーザーに表示されます。</p>



<p>このしくみによって、JSPは1枚のファイルで「HTMLの見た目」と「動的な処理」を両立させることができます。</p>



<p class="has-text-align-center"><strong>JSPの動き方の流れ</strong></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin">ユーザーが <code>.jsp</code> ファイルをリクエストする（例：<code>hello.jsp</code>）</li>



<li class="is-style-bottom-margin-1em has-bottom-margin">Tomcat がその <code>.jsp</code> を読んで、中の Java を実行</li>



<li class="is-style-bottom-margin-1em has-bottom-margin">結果として HTML を作り出し、ブラウザに返す</li>



<li>ブラウザには、あたかも普通のHTMLのように見える</li>
</ol>



<p>この一連の流れによって、「動きのあるページ」がリクエスト元に返却されることになります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ１</span>　<strong>JSPファイルとは？</strong></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">HTMLだけでは静的なページしか作れない。<br>→JSPを使うことで動的なページが作成できます。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">JSPは、JavaのコードをHTMLに埋め込むことで、アクセスごとに変化するページを生成。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">JSPは、Webサーバー上で実行され、結果がHTMLとしてブラウザに表示される。</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc5">JSPを動かすための準備</span></h2>



<p>JSPファイルは、<strong>通常のHTMLファイルと違い、単独では動作しません。</strong>JSPはサーバー側でJavaのコードを実行する仕組みのため、その処理を受け持つ「Webサーバー」や「Javaの開発環境」が必要です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この章では、JSPを動かすために必要なソフトウェアや環境を、1つずつ順を追って準備していきます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc6">JSPの動作に必要なもの</span></h3>



<p>JSPを動作させるには、次の3つが必要です。<strong>ここでは、それってそもそも何？みたいな説明＋実際にあなたのPCにインストールする手順をメモ程度に記載しておきますので、この辺の知識がすでにあるよ！という方は読み飛ばしてください。</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>項目</th><th>説明</th></tr></thead><tbody><tr><td>JDK（Java Development Kit）</td><td>Javaのプログラムを実行するために必要なソフトウェアです。JSPはJavaで動作するため、必ず必要になります。</td></tr><tr><td>Tomcat（トムキャット）</td><td>JSPファイルを処理し、Javaのコードを実行してHTMLに変換するWebサーバーです。</td></tr><tr><td>エディタ（テキスト編集ソフト）</td><td>JSPファイルを作成するための道具です。Visual Studio Code（VS Code）やIntelliJ IDEAなどが便利です。</td></tr></tbody></table></div></figure>



<h4 class="wp-block-heading">JDKのインストール</h4>



<p>まず、Javaの開発環境であるJDKをインストールします。JDKがインストールされていないと、JSPも動作しません。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/java/java-setup/" title="Javaの開発環境構築の３ステップ解説（JDK/JRE/JVMの仕組みを１から解説）" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/05/image-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/05/image-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/05/image-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/05/image-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Javaの開発環境構築の３ステップ解説（JDK/JRE/JVMの仕組みを１から解説）</div><div class="blogcard-snippet internal-blogcard-snippet">【超・初心者向け】Javaの開発環境を初心者向けに簡単に設定する方法をわかりやすく解説します。JDKのインストール、IDEの選択、開発のスタートまで、スムーズにJavaプログラミングを始める方法をご説明します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.03.05</div></div></div></div></a>
</div></figure>



<p class="has-text-align-center"><span class="inline-button-green">手順</span></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">Oracleの公式サイトまたはOpenJDKのサイトから、JDKをダウンロード。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">お使いのOSに合ったインストーラを選び、画面の指示に従ってインストール。</li>



<li>インストール後、コマンドプロンプト（またはターミナル）を開き、↓のコマンドを入力。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java -version
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>バージョンが表示されれば、正常にインストールされています。</p>
</div></div>



<h4 class="wp-block-heading">Tomcatのインストール</h4>



<p>JSPファイルを処理するために、Tomcatをインストールします。<strong><span class="marker-under">TomcatはJavaで動作するWebサーバー</span></strong>で、JSPの実行に適した軽量なサーバーです。</p>



<p class="has-text-align-center"><span class="inline-button-green">手順</span></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">Apache Tomcat の公式サイトにアクセス。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">zip ファイル（Windows の場合）または tar.gz ファイル（Mac/Linux の場合）をダウンロード。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">ダウンロードしたファイルを任意の場所に展開（解凍）。<br>→<code>C:\tomcat</code> や <code>~/tomcat</code> などが一般的ですが、どこでもOK。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><code>bin</code>フォルダにある <code>startup.bat</code>（Windows）または <code>startup.sh</code>（Mac/Linux）を実行。</li>



<li>ブラウザを開き、次のURLにアクセスします：</li>
</ol>




<a rel="noopener" href="http://localhost:8080/" title="&#28961;&#21177;&#12394;URL&#12391;&#12377;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/http%3A%2F%2Flocalhost%3A8080%2F?w=320&#038;h=180" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">&#28961;&#21177;&#12394;URL&#12391;&#12377;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=http://localhost:8080/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">localhost</div></div></div></div></a>
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Tomcatのトップページが表示されれば、インストールは成功です。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p>注意：すでに他のアプリケーションがポート8080を使っている場合、Tomcatが起動できないことがあります。その場合は、設定ファイル（server.xml）でポート番号を変更してください。</p>
</div>



<h4 class="wp-block-heading">JSP用のフォルダを作る</h4>



<p>Tomcatでは、<code><span class="bold-blue">webapps</span></code> フォルダの中にあるプロジェクトが自動的に読み込まれます。自分でJSPファイルを作って表示するには、ここに新しいフォルダを作成します。</p>



<p class="has-text-align-center"><span class="inline-button-green">手順</span></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">Tomcatフォルダ内の <code>webapps</code> に移動。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">新しくフォルダを作成し、たとえば <code>jsp-demo</code> という名前をつける。</li>



<li><code>jsp-demo</code> フォルダの中に、最初のJSPファイルを作成します。ファイル名は <code>hello.jsp</code> など。</li>
</ol>



<h4 class="wp-block-heading">エディタの準備</h4>



<p>JSPファイルは、普通のテキストファイルとして作成できますが、プログラミングに適したエディタを使うと効率が上がります。以下のいずれかのエディタを使用するのが一般的です。</p>



<ul class="wp-block-list">
<li>Visual Studio Code（無料で軽量、拡張機能が豊富）</li>



<li>IntelliJ IDEA（Javaに特化した統合開発環境）</li>



<li>Eclipse（Java開発で定番のIDE）</li>
</ul>



<p>初心者の方には、<strong>Visual Studio Codeが扱いやすくおすすめ</strong>です。必要に応じて「Java Extension Pack」などを追加すると、補完機能や構文チェックも利用できます。</p>



<h2 class="wp-block-heading"><span id="toc7">最初のJSPファイルを作ってみよう</span></h2>



<p>前の章で、JSPを動かすための準備が整いました。この章では、実際にJSPファイルを1つ作成し、それをブラウザで表示するところまで進めます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでは、「JSPとはどういうものか」を実際に体験しながら、基本的な書き方や仕組みを理解していきます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc8">JSPファイルとはどんなファイルか</span></h3>



<p>JSPファイルは、基本的にはHTMLっぽく見えるコードで、この中の必要な部分にJavaのコードを差し込むことで、表示内容を動的に変えることができるようにしています。たとえば、「現在の日時を表示する」などの処理が可能になります。</p>



<p>JSPファイルの拡張子は <code><span class="bold-blue">.jsp</span></code> です。ファイルの中には、通常のHTMLタグと、Javaのコードが組み合わさって記述されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
&lt;!DOCTYPE html>
&lt;html>
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;title>Hello JSP&lt;/title>
&lt;/head>
&lt;body>
  &lt;h1>こんにちは、JSPの世界へようこそ！&lt;/h1>
  &lt;p>現在の時刻は：&lt;%= java.time.LocalDateTime.now() %>&lt;/p>
&lt;/body>
&lt;/html>
</pre>



<p>上記のJSPファイルの中では、JavaのコードとHTMLが組み合わさっています。それぞれの部分について説明します。</p>



<ul class="wp-block-list is-style-icon-list-circle has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><code>&lt;%@ page contentType="text/html; charset=UTF-8" %></code><br>→ この行は「ページ全体の設定」です。文字コードをUTF-8にすることで、文字化けを防ぎます。</li>



<li><code>&lt;%= java.time.LocalDateTime.now() %></code><br>→ この部分がJSPの特徴です。「現在の時刻を表示する」Javaのコードが入っています。<br><code>&lt;%=</code> と <code>%></code> で囲まれた中はJavaの「式」として実行され、結果がそのままHTMLに差し込まれます。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>上記のファイルをブラウザで表示するためにエディタで編集して保存しましょう。</p>
</div></div>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">Tomcatの <code>webapps</code> フォルダの中にある、前章で作成した <code>jsp-demo</code> フォルダに移動。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><code>hello.jsp</code> という名前の新しいファイルを作成。</li>



<li>ファイルをエディタで開き、↑の内容を記述し保存！</li>
</ol>



<h3 class="wp-block-heading"><span id="toc9">ブラウザで表示してみる</span></h3>



<p>ファイルを保存したら、Tomcatが起動していることを確認し、ブラウザで次のURLにアクセスしてみましょう。</p>




<a rel="noopener" href="http://localhost:8080/jsp-demo/hello.jsp" title="&#28961;&#21177;&#12394;URL&#12391;&#12377;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/http%3A%2F%2Flocalhost%3A8080%2Fjsp-demo%2Fhello.jsp?w=320&#038;h=180" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">&#28961;&#21177;&#12394;URL&#12391;&#12377;</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=http://localhost:8080/jsp-demo/hello.jsp" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">localhost</div></div></div></div></a>
</pre>



<p>画面に「こんにちは、JSPの世界へようこそ！」という見出しと、現在の時刻が表示されていれば成功です。</p>



<p>ブラウザでページを更新するたびに、時刻が変化するはずです。これは、<strong>JSPがアクセスされるたびにJavaのコードを実行して、ページの中身を動的に作っている</strong>ということを意味します。</p>



<h2 class="wp-block-heading"><span id="toc10">JSPの基本構文</span></h2>



<p>前の章では、JSPファイルを作成し、Javaのコードを埋め込むことで「現在の時刻を表示する」ページを作成しました。ここからは、JSPファイルで使われる代表的な構文について解説します。どのようにJavaのコードをHTMLに差し込むのか、そしてJSP特有の書き方にはどんな種類があるのかを、順を追って学習していきましょう。</p>



<h3 class="wp-block-heading"><span id="toc11">JSPの構成要素</span></h3>



<p>JSPでは、<strong>以下の4種類の記述形式が用意されています</strong>。これらを使い分けることで、Javaの処理とHTMLの表示を同時に扱うことができます。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>種類</th><th>記述方法</th><th>役割</th></tr></thead><tbody><tr><td>ディレクティブ</td><td><code>&lt;%<span class="bold-red">@</span> ... %></code></td><td>ページ全体の設定を行う（文字コードなど）</td></tr><tr><td>スクリプトレット</td><td><code>&lt;% ... %&gt;</code></td><td>Javaの処理（変数の定義や条件分岐など）を書く</td></tr><tr><td>式（Expression）</td><td><code>&lt;%<span class="bold-red">=</span> ... %></code></td><td>Javaの値をそのままHTMLに出力する</td></tr><tr><td>宣言</td><td><code>&lt;%<span class="bold-red">!</span> ... %></code></td><td>メソッドやフィールドを定義する（あまり使われない）</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading"><span id="toc12">ディレクティブ</span></h3>



<p>ディレクティブは、JSPファイル全体に関する設定を行うものです。最もよく使われるのは <code>page</code> ディレクティブです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この記述によって、出力するHTMLの文字コードがUTF-8になります。日本語を正しく表示するために必須です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc13">スクリプトレット</span></h3>



<p>スクリプトレットは、JSPファイル内にJavaの処理を書くための領域です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%
  int year = java.time.LocalDate.now().getYear();
  String message = "今年は " + year + " 年です。";
%>
&lt;p>&lt;%= message %>&lt;/p>
</pre>



<p>この例では、Javaで現在の年を取得し、それを文字列として作成しています。そして <code>&lt;%= ... %&gt;</code> を使って、結果をHTMLに出力しています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>スクリプトレットの中ではJavaの文法がそのまま使えます。ただし、後述するように<strong>スクリプトレットは新しい開発ではなるべく使わない方向にあります</strong>。</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc14">式（Expression）</span></h3>



<p>式は、値をそのままHTMLとして出力したいときに使います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;p>こんにちは、&lt;%= "JSPユーザー" %>さん！&lt;/p>
</pre>



<p>上の例では、<code>"JSPユーザー"</code> という文字列がHTMLに挿入され、ブラウザには次のように表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">こんにちは、JSPユーザーさん！
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この書き方は非常にシンプルで、<strong>値を表示するだけ</strong>であれば便利ですが、複雑な処理は向きません。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc15">宣言</span></h3>



<p>宣言は、JSPファイルの中で<strong>メソッドや変数を定義したい場合</strong>に使います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%! 
  private String getGreeting(String name) {
    return "こんにちは、" + name + "さん！";
  }
%>
&lt;p>&lt;%= getGreeting("太郎") %>&lt;/p>
</pre>



<p>このように、JSPファイルの中で小さな関数を定義して、それを式の中で呼び出すこともできます。<strong>ただし、JSPファイルに処理を詰め込みすぎると保守が難しくなるため、このような記述はできるだけ避け、外部のJavaクラスに処理を分けることが望まれます。</strong></p>



<h3 class="wp-block-heading"><span id="toc16">コメントの書き方</span></h3>



<p>JSPには、HTMLのコメントと、JSP用のコメントの2種類があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!-- これはHTMLのコメントです（ブラウザの「ページのソース」に表示されます） -->

&lt;%-- これはJSPのコメントです（ブラウザには一切表示されません） --%>
</pre>



<p>HTMLのコメントはWebページに送信されるため、内容を見られる可能性があります。<br>一方、JSPのコメントはサーバー側で処理が止まるため、セキュリティ的に重要なコメントや開発者向けのメモはJSPのコメントで書くのが安全です。</p>



<h3 class="wp-block-heading"><span id="toc17">スクリプトレットはなるべく使わない</span></h3>



<p>JSPの構文として紹介しましたが、<strong>スクリプトレット（<code>&lt;% ... %></code>）の使用は、今では非推奨</strong>とされています。理由は以下の通り。</p>



<ul class="wp-block-list is-style-icon-list-cross has-list-style">
<li>HTMLとJavaのロジックが混ざることで、読みづらくなる</li>



<li>保守性が下がり、エラーが起きやすくなる</li>



<li>JSTL（JSP標準タグライブラリ）やEL（式言語）の方がシンプルで安全に書ける</li>
</ul>



<p>そのため、今後はJSTLやELを使って、できるだけ「Javaコードを書かずに表示を制御する方法」を覚えていくことが大切です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>JSPの基本構文</strong></p>



<ul class="wp-block-list">
<li>JSPには、ディレクティブ・スクリプトレット・式・宣言という4種類の書き方がある。</li>



<li>スクリプトレットや宣言ではJavaの文法をそのまま使うことができるが、使いすぎは避けるべし。</li>



<li>式（<code>&lt;%= ... %></code>）は、値を簡単に出力するのに便利です。</li>



<li>コメントは、必要に応じてJSPコメント（<code>&lt;%-- --%></code>）を使いましょう。</li>
</ul>
</div>



<p>次の章では、<strong>JSTLとEL（式言語）を使った“スクリプトレットを使わない”JSPの書き方</strong>を学びます。より読みやすく、安全なJSPの記述方法を習得していきましょう。</p>



<h2 class="wp-block-heading"><span id="toc18">ELとJSTLでスクリプトレットのないJSPへ</span></h2>



<p>ここまでの解説では、JSPの基本構文としてスクリプトレット（<code>&lt;% ... %></code>）などを紹介しました。<br>しかし近年のJSP開発では、<strong>スクリプトレットを使わない記述スタイル</strong>が主流となっています。</p>



<p>この章では、<strong>EL（Expression Language）とJSTL（JSP Standard Tag Library）</strong>という2つの仕組みを使って、<strong>JSPファイルの中にJavaコードを書かずに動的な表示を行う方法</strong>を学んでいきます。</p>



<h3 class="wp-block-heading"><span id="toc19">EL（式言語）とは</span></h3>



<p>EL（Expression Language）は、JSPの中で<strong>Javaの値を簡潔に記述するための言語</strong>です。<br>スクリプトレットのように <code>&lt;%=</code> で囲む必要がなく、シンプルに <code>${変数名}</code> と書くだけで値を出力できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;p>こんにちは、${userName} さん。&lt;/p>
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このコードでは、Javaのサーバー側で <code>userName</code> という名前のデータ（属性）が用意されていれば、自動的にその値が表示されます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc20">JSTL（JSP標準タグライブラリ）とは</span></h3>



<p>JSTLとは、JSP上で使える<strong>共通の処理をあらかじめタグ化したライブラリ</strong>です。<br>たとえば、以下のような処理が可能です。</p>



<ul class="wp-block-list">
<li>条件分岐（if）</li>



<li>繰り返し処理（forEach）</li>



<li>値のフォーマット（日付や数値）</li>



<li>URLの生成</li>
</ul>



<p>JSTLを使うことで、<strong>複雑なJavaの処理をわかりやすいタグで書くことができる</strong>ようになります。</p>



<h4 class="wp-block-heading">JSTLを使う準備</h4>



<p>JSTLを使うには、JSTLライブラリの <code>.jar</code> ファイルを JSPプロジェクトの中に追加する必要があります。</p>



<p class="has-text-align-center"><span class="inline-button-green">手順</span></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin">JSTLの最新版（Jakarta標準）をダウンロード<br>→ <a>https://jakarta.ee/specifications/tags/</a></li>



<li class="is-style-bottom-margin-2em has-bottom-margin">ダウンロードした <code>jakarta.servlet.jsp.jstl-api-x.x.x.jar</code> などの <code>.jar</code> ファイルを、Tomcatの <code>lib</code> フォルダ、またはプロジェクトの <code>WEB-INF/lib</code> フォルダにコピーします。</li>



<li>JSPファイルの先頭に、以下のようにタグライブラリを読み込む宣言を記述します。</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ taglib prefix="c" uri="https://jakarta.ee/taglibs/core" %>
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この設定により、<code>&lt;c:if></code> や <code>&lt;c:forEach></code> などのJSTLタグが使えるようになります。</p>
</div></div>



<h4 class="wp-block-heading">JSTLで条件分岐をする</h4>



<p>スクリプトレットで <code>if</code> 文を書かなくても、JSTLの <code>&lt;c:if&gt;</code> タグを使うことで簡単に条件分岐ができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ taglib prefix="c" uri="https://jakarta.ee/taglibs/core" %>
&lt;c:if test="${loginUser != null}">
  &lt;p>ようこそ、${loginUser.name} さん&lt;/p>
&lt;/c:if>
</pre>



<p>このように、<code>loginUser</code> という属性が <code>null</code> でなければ、挨拶文が表示されます。</p>



<h4 class="wp-block-heading">JSTLで繰り返し表示をする</h4>



<p>リストや配列の内容を繰り返し表示するには、<code>&lt;c:forEach&gt;</code> を使います。</p>



<p>サーバー側で、次のようにリストをセットしておきます（Servletなどで）：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">List&lt;String> names = List.of("太郎", "花子", "次郎");
request.setAttribute("nameList", names);
</pre>



<p>JSPファイルでは、次のように記述します：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ taglib prefix="c" uri="https://jakarta.ee/taglibs/core" %>
&lt;ul>
  &lt;c:forEach var="name" items="${nameList}">
    &lt;li>${name}&lt;/li>
  &lt;/c:forEach>
&lt;/ul>
</pre>



<p>このコードにより、以下のようなHTMLが生成されます：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;ul>
  &lt;li>太郎&lt;/li>
  &lt;li>花子&lt;/li>
  &lt;li>次郎&lt;/li>
&lt;/ul>
</pre>



<h3 class="wp-block-heading"><span id="toc21">JSPをすっきり保つために</span></h3>



<p>ELとJSTLを使うことで、JSPファイル内にJavaのコードを書く必要がなくなり、<strong>HTMLに近い構造を保ちながら動的な処理を行うことができます。</strong><br>これは、JSPを読みやすく・保守しやすくする上でも非常に重要です。</p>



<p>また、デザイナーと共同で作業するようなプロジェクトでも、HTMLに近い見た目を保つことで、分業がしやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc22">フォームからデータを受け取る</span></h2>



<p>JSPを使ってWebアプリケーションを作成する際、ユーザーの入力に応じて処理を行うことは非常に重要です。この章では、<strong>HTMLのフォームを使って入力されたデータを、JSPで受け取って表示する方法</strong>を学びます。</p>



<h3 class="wp-block-heading"><span id="toc23">フォーム送信の流れ</span></h3>



<p>フォームを使った処理は、次のような流れで行われます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li>入力フォームのあるページ（JSP）を表示する</li>



<li>ユーザーが名前などの情報を入力し、送信ボタンを押す</li>



<li>入力内容がサーバーに送られる</li>



<li>受け取ったJSPファイルがその情報を読み取り、画面に表示する</li>
</ol>



<p>JSPではこの一連の流れを、HTMLとJavaの仕組みで簡単に実現できます。</p>



<h3 class="wp-block-heading"><span id="toc24">フォームを作るJSP（entry.jsp）</span></h3>



<p>まずは、名前を入力するための簡単なフォームを作成します。</p>



<h4 class="wp-block-heading">entry.jsp</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;!DOCTYPE html>
&lt;html>
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;title>名前の入力&lt;/title>
&lt;/head>
&lt;body>
  &lt;h2>お名前を入力してください&lt;/h2>
  &lt;form action="result.jsp" method="post">
    &lt;label>名前：&lt;input type="text" name="username" />&lt;/label>
    &lt;input type="submit" value="送信" />
  &lt;/form>
&lt;/body>
&lt;/html>
</pre>



<p>このページでは、名前を入力して「送信」ボタンを押すと、<code>result.jsp</code> にPOSTリクエストでデータが送信されます。</p>



<h3 class="wp-block-heading"><span id="toc25">データを受け取るJSP（result.jsp）</span></h3>



<p>次に、送信されたデータを受け取って表示するためのJSPファイルを作成します。</p>



<h4 class="wp-block-heading">result.jsp</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
&lt;!DOCTYPE html>
&lt;html>
&lt;head>
  &lt;meta charset="UTF-8">
  &lt;title>入力結果&lt;/title>
&lt;/head>
&lt;body>
  &lt;h2>ようこそ！&lt;/h2>
  &lt;p>あなたの名前は &lt;strong>&lt;%= request.getParameter("username") %>&lt;/strong> さんですね。&lt;/p>
&lt;/body>
&lt;/html>
</pre>



<p>ここでは、<code>request.getParameter("username")</code> というコードで、フォームから送られたデータを取得しています。</p>



<ul class="wp-block-list">
<li><code>request</code> はJSPに自動で用意されているオブジェクト。</li>



<li><code>getParameter("username")</code> は、フォームの<code>name="username"</code> に対応した値を取得するメソッド。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc26">ELを使って書き換える</span></h3>



<p>JSTLやELを使えば、<code>result.jsp</code> をもっとすっきり書くこともできます。以下のようにリクエスト属性に値をセットしてから表示することで、式言語を活用できます。</p>



<h4 class="wp-block-heading">Servlet側（例）</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String name = request.getParameter("username");
request.setAttribute("username", name);
request.getRequestDispatcher("/result.jsp").forward(request, response);
</pre>



<h4 class="wp-block-heading">result.jsp：</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ taglib prefix="c" uri="https://jakarta.ee/taglibs/core" %>
&lt;p>こんにちは、${username} さん！&lt;/p>
</pre>



<p>ただし、Servletを使う方法はこのガイドの後半で詳しく扱いますので、今はまず <code>request.getParameter()</code> による受け取りに慣れることをおすすめします。</p>



<h2 class="wp-block-heading"><span id="toc27">セッションとCookieでデータを保持する</span></h2>



<p>JSPでは、ユーザーが入力した情報を「別のページでも使いたい」という場面がよくあります。<br>たとえば、ログイン状態を維持したり、前の画面で入力された名前を次の画面でも表示したりする場合です。</p>



<p>そのようなときに役立つのが <strong>セッション（Session）</strong> と <strong>クッキー（Cookie）</strong> です。<br>この章では、それぞれの役割と使い方を学びます。</p>



<h3 class="wp-block-heading"><span id="toc28">セッションの基本操作</span></h3>



<h4 class="wp-block-heading">データの保存：</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%
  String name = request.getParameter("username");
  session.setAttribute("userName", name);
%>
</pre>



<p>このコードは、<code>userName</code> という名前でセッションに値を保存します。</p>



<h4 class="wp-block-heading">データの取得：</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%
  String name = (String) session.getAttribute("userName");
%>
&lt;p>ようこそ、&lt;%= name %> さん&lt;/p>
</pre>



<p>このようにすれば、<strong>前のページで保存した値を、別のページで取り出して使うことができます。</strong></p>



<h4 class="wp-block-heading">セッションの有効期間と注意点</h4>



<p>セッションは、ユーザーがブラウザを閉じるか、一定時間操作をしないと自動的に無効になります。Tomcatの初期設定では、30分間操作がないとセッションが切れます。</p>



<p>また、<strong>多くの情報をセッションに保存しすぎると、サーバーのメモリを圧迫する可能性がある</strong>ため、用途を絞って使うことが大切です。</p>



<h3 class="wp-block-heading"><span id="toc29">Cookieとは</span></h3>



<p>Cookie（クッキー）は、<strong>情報をユーザーのブラウザに保存する仕組み</strong>です。<br>サーバー側から「この情報を保存しておいてください」と指示すると、ブラウザがその内容を保持し、次回以降のアクセス時にその情報を自動的に送信してきます。</p>



<h3 class="wp-block-heading"><span id="toc30">Cookieの基本操作</span></h3>



<h4 class="wp-block-heading">Cookieの作成と送信：</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%
  String name = request.getParameter("username");
  Cookie cookie = new Cookie("userName", name);
  cookie.setMaxAge(60 * 60); // 1時間（秒単位）
  response.addCookie(cookie);
%>
</pre>



<h4 class="wp-block-heading">Cookieの取得：</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%
  String name = "";
  Cookie[] cookies = request.getCookies();
  if (cookies != null) {
    for (Cookie c : cookies) {
      if ("userName".equals(c.getName())) {
        name = c.getValue();
      }
    }
  }
%>
&lt;p>こんにちは、&lt;%= name %> さん&lt;/p>
</pre>



<p>このように、Cookieを使えば、ブラウザに保存された情報を次回のアクセス時にも利用できます。</p>



<h3 class="wp-block-heading"><span id="toc31">セッションとCookieの使い分け</span></h3>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>比較項目</th><th>セッション</th><th>Cookie</th></tr></thead><tbody><tr><td>保存場所</td><td>サーバー側</td><td>ブラウザ側</td></tr><tr><td>有効期間</td><td>ログアウトや時間切れまで</td><td>明示的に期限を設定できる</td></tr><tr><td>データの大きさ</td><td>比較的大きなデータがOK</td><td>少量（4KBまで）</td></tr><tr><td>セキュリティ</td><td>比較的安全（外部に見えない）</td><td>攻撃に注意が必要（盗聴・改ざん）</td></tr></tbody></table></div></figure>



<p><strong>一時的な状態保持（ログイン情報など）にはセッション</strong>、<br><strong>ユーザーに関連する設定（言語選択やテーマなど）にはCookie</strong>がよく使われます。</p>



<h2 class="wp-block-heading"><span id="toc32">JSPで簡単なアンケートアプリを作ろう</span></h2>



<p>JSPを使ってWebアプリケーションを作るには、「複数ページにまたがる処理」を整理することが大切です。<br>この章では、<strong>3画面構成のアンケートアプリ</strong>を作り、情報の受け渡し、表示の切り替え、セッションの活用を総合的に体験します。</p>



<h3 class="wp-block-heading"><span id="toc33">アプリの構成と目的</span></h3>



<p>このアプリでは、以下のような流れでユーザーにアンケートに答えてもらい、最終画面でまとめて表示します。</p>



<ol class="wp-block-list">
<li><strong>入力画面</strong>：名前と好きな色を入力（form）</li>



<li><strong>確認画面</strong>：入力された内容を表示（セッションで一時保持）</li>



<li><strong>完了画面</strong>：ありがとうメッセージと入力内容の最終確認</li>
</ol>



<p class="has-text-align-center"><strong>プロジェクト構造</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">jsp-demo/
├─ input.jsp     （入力画面）
├─ confirm.jsp   （確認画面）
└─ thanks.jsp    （完了画面）
</pre>



<h4 class="wp-block-heading">入力画面：input.jsp</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
&lt;!DOCTYPE html>
&lt;html>
&lt;head>&lt;meta charset="UTF-8">&lt;title>アンケート入力&lt;/title>&lt;/head>
&lt;body>
  &lt;h2>アンケートにご協力ください&lt;/h2>
  &lt;form action="confirm.jsp" method="post">
    &lt;p>お名前：&lt;input type="text" name="userName" />&lt;/p>
    &lt;p>好きな色：
      &lt;select name="favoriteColor">
        &lt;option value="赤">赤&lt;/option>
        &lt;option value="青">青&lt;/option>
        &lt;option value="緑">緑&lt;/option>
      &lt;/select>
    &lt;/p>
    &lt;input type="submit" value="確認画面へ" />
  &lt;/form>
&lt;/body>
&lt;/html>
</pre>



<h4 class="wp-block-heading">確認画面：confirm.jsp</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
&lt;%
  String userName = request.getParameter("userName");
  String favoriteColor = request.getParameter("favoriteColor");

  session.setAttribute("userName", userName);
  session.setAttribute("favoriteColor", favoriteColor);
%>
&lt;!DOCTYPE html>
&lt;html>
&lt;head>&lt;meta charset="UTF-8">&lt;title>確認画面&lt;/title>&lt;/head>
&lt;body>
  &lt;h2>以下の内容でよろしいですか？&lt;/h2>
  &lt;p>お名前：&lt;%= userName %>&lt;/p>
  &lt;p>好きな色：&lt;%= favoriteColor %>&lt;/p>
  &lt;form action="thanks.jsp" method="post">
    &lt;input type="submit" value="送信する" />
  &lt;/form>
&lt;/body>
&lt;/html>
</pre>



<h4 class="wp-block-heading">完了画面：thanks.jsp</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="html" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;%@ page contentType="text/html; charset=UTF-8" %>
&lt;%
  String name = (String) session.getAttribute("userName");
  String color = (String) session.getAttribute("favoriteColor");

  // 必要があればセッションのデータを破棄
  session.invalidate();
%>
&lt;!DOCTYPE html>
&lt;html>
&lt;head>&lt;meta charset="UTF-8">&lt;title>送信完了&lt;/title>&lt;/head>
&lt;body>
  &lt;h2>ご協力ありがとうございました！&lt;/h2>
  &lt;p>&lt;strong>&lt;%= name %>&lt;/strong> さんの好きな色は &lt;strong>&lt;%= color %>&lt;/strong> ですね。&lt;/p>
&lt;/body>
&lt;/html>
</pre>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center">&#x2705; まとめ</p>



<ul class="wp-block-list">
<li><strong>JSPとは何か</strong>
<ul class="wp-block-list">
<li>HTMLにJavaの処理を埋め込んで、動的なWebページを作成できる技術</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">サーバー側で処理され、HTMLとしてブラウザに返される</li>
</ul>
</li>



<li><strong>JSPの実行に必要な環境</strong>
<ul class="wp-block-list">
<li>JDKとTomcatが必須（Java実行環境とWebサーバー）</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">JSPファイルはTomcatの<code>webapps</code>内に配置することで動作する</li>
</ul>
</li>



<li><strong>JSPファイルの基本構文</strong>
<ul class="wp-block-list">
<li><code>&lt;%@ page %></code>：ページ全体の設定</li>



<li><code>&lt;%= ... %></code>：Javaの値をHTMLに出力</li>



<li><code>&lt;% ... %></code>：処理を書く（スクリプトレット）</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><code>&lt;%! ... %></code>：変数やメソッドの宣言</li>
</ul>
</li>



<li><strong>スクリプトレットの非推奨と代替方法</strong>
<ul class="wp-block-list">
<li>EL（式言語）で<code>${変数名}</code>と書くと簡単に出力可能</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">JSTLで<code>&lt;c:if></code>や<code>&lt;c:forEach></code>などの制御構文を記述可能</li>
</ul>
</li>



<li><strong>フォームデータの送受信</strong>
<ul class="wp-block-list">
<li><code>&lt;form></code>タグでデータをPOST送信し、<code>request.getParameter()</code>で取得</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">データをセッションに保存して複数ページで利用可能</li>
</ul>
</li>



<li><strong>セッションとCookieの使い分け</strong>
<ul class="wp-block-list">
<li>セッション：サーバー側に一時的に情報を保持（ログイン状態など）</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">Cookie：ブラウザに保存し、次回アクセス時に自動送信（言語設定など）</li>
</ul>
</li>
</ul>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】ジェネリクス&#060;&gt;とは？初心者向けに１から解説</title>
		<link>https://it-biz.online/java/java-generics/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 17 Apr 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10306</guid>

					<description><![CDATA[ジェネリクス（Generics）とは、Javaで変数やクラスの「型をあとから自由に指定できる仕組み」です。以下のようなコードを見て、&#60;&#62;って何？と思ってこのページにたどり着いた方も多いはずですが この「&#038;lt [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>ジェネリクス（Generics）</strong>とは、Javaで変数やクラスの<strong><span class="marker-under">「型をあとから自由に指定できる仕組み」</span></strong>です。以下のようなコードを見て、&lt;&gt;って何？と思ってこのページにたどり着いた方も多いはずですが</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ArrayList&lt;String> list = new ArrayList&lt;>();
</pre>



<p>この「<code><span class="blue">&lt;String&gt;</span></code>」の部分がジェネリクスです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ジェネリクスとは？</a></li><li><a href="#toc2" tabindex="0">ジェネリクスが登場した理由とメリット</a><ol><li><a href="#toc3" tabindex="0">まずはイメージをつかむ</a></li></ol></li><li><a href="#toc4" tabindex="0">ジェネリクスの基本構文</a><ol><li><a href="#toc5" tabindex="0">ジェネリクスのよくある使い方</a></li></ol></li><li><a href="#toc6" tabindex="0">【応用編】自分でジェネリクスクラスを作る方法</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ジェネリクスとは？</span></h2>



<p>ジェネリクス（Generics）とは、Javaで使われる「<strong>型を指定できる仕組み</strong>」のことです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>…でも、これだけだとまだイメージが湧きませんよね。</p>
</div></div>



<p>もう少しわかりやすく言うと、</p>



<ul class="wp-block-list">
<li>「この箱には、文字列だけを入れたい」</li>



<li>「あの箱には、数字だけを入れたい」</li>
</ul>



<p>のように、「扱えるデータの種類をあらかじめ指定することができる」のがジェネリクスの基本的な考え方です。</p>



<h2 class="wp-block-heading"><span id="toc2">ジェネリクスが登場した理由とメリット</span></h2>



<p>昔のJavaにはジェネリクスがありませんでした。そのため…</p>



<ul class="wp-block-list">
<li>箱に色々な種類のデータが混ざってしまう</li>



<li>取り出すときに「これって何型だったかな？」とキャスト（型変換）が必要で面倒だった</li>
</ul>



<p>そこで登場したのがジェネリクス。メリットは3つあります。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>メリット</th><th>意味</th><th>効果</th></tr></thead><tbody><tr><td>型安全</td><td>決めた型しか入れないようにする</td><td>間違った型を入れられない</td></tr><tr><td>キャスト不要</td><td>型が決まっているので変換不要</td><td>コードが短くなりスッキリ</td></tr><tr><td>読みやすい</td><td>一目で型がわかる</td><td>他の人がコードを見た時もわかりやすい</td></tr></tbody></table></div></figure>



<h3 class="wp-block-heading"><span id="toc3">まずはイメージをつかむ</span></h3>



<p class="has-text-align-center"><strong>ジェネリクス無しの世界&#x1f622;</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[りんご, 100, バナナ, 200, メロン…]
</pre>



<ul class="wp-block-list">
<li>何が入っているか不明</li>



<li>取り出してから「これは何？」と確認が必要</li>
</ul>



<p class="has-text-align-center"><strong>ジェネリクス有りの世界&#x2728;</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">箱A&lt;String>：[りんご, バナナ, メロン]
箱B&lt;Integer>：[100, 200, 300]
</pre>



<ul class="wp-block-list">
<li>最初から型が決まっていて、混ざることがない</li>



<li>安全で取り出しやすい！</li>
</ul>



<p>そのため、ジェネリクスは、<strong><code>ArrayList</code> や <code>HashMap</code> などのコレクション系クラスで最もよく使われます。</strong><br>コレクションは「複数の値をまとめて持つ」ので、<strong>何の型を入れるか決めることに</strong>おおきなメリットがあるためです。もちろんコレクション以外でも利用できるシーンはありますが、基本はコレクション系のクラスでよく使える！っていう風に理解しておくとよいでしょう。</p>



<h2 class="wp-block-heading"><span id="toc4">ジェネリクスの基本構文</span></h2>



<p>ジェネリクスは次のように書きます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">クラス名&lt;型名> 変数名 = new クラス名&lt;型名>();
</pre>



<ul class="wp-block-list">
<li><code>クラス名</code>：ArrayListやHashMapなど</li>



<li><code>型名</code>：StringやIntegerなど扱う型</li>
</ul>



<p>例えば、「文字列だけを入れる箱」を作るには…</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ArrayList&lt;String> fruits = new ArrayList&lt;String>();
</pre>



<p>これが基本形です。（最近のJavaなら右辺の型は省略可能！）</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ArrayList&lt;String> fruits = new ArrayList&lt;>();
</pre>



<h3 class="wp-block-heading"><span id="toc5">ジェネリクスのよくある使い方</span></h3>



<p>ジェネリクスを利用すると、リストから要素を取り出す際に明示的なキャストが不要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">List&lt;Integer> intList = new ArrayList&lt;>();
intList.add(1);
intList.add(2);

for (Integer num : intList) {
    System.out.println(num);
}
</pre>



<p>この例では、<code>intList</code> に格納される値は常に <code>Integer</code> 型であることが保証されているため、ループ内でキャストする必要がありません。また、誤った型の要素がリストに含まれることを防ぐことができます。</p>



<p>もし、ジェネリクスを使わずに <code>List</code> を定義すると、以下のように明示的な<a href="https://it-biz.online/java/type-cast/">キャスト</a>が必要になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">List list = new ArrayList();
list.add("Hello");
String str = (String) list.get(0); // キャストが必要
</pre>



<p>このようなコードでは、リストに異なる型の値が混在する可能性があり、実行時に <code>ClassCastException</code> が発生するリスクがあります。ジェネリクスを使用することで、上記の問題を解決できます。以下のように書き換えることで、型安全性が向上します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">List&lt;String> list = new ArrayList&lt;>();
list.add("Hello");
String str = list.get(0); // キャスト不要
</pre>



<p>この場合、リストには <code>String</code> 型の値のみを格納できるため、キャストが不要になります。また、型が保証されるため、誤った型を扱うことによるエラーを未然に防ぐことができます。</p>



<h2 class="wp-block-heading"><span id="toc6">【応用編】自分でジェネリクスクラスを作る方法</span></h2>



<p>ジェネリクスはコレクションだけでなく、独自クラスにも適用できます。例えば、以下のような汎用的なクラスを定義する例を見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Box&lt;T> {
    private T data;

    void set(T data) { this.data = data; }
    T get() { return data; }
}

Box&lt;String> box = new Box&lt;>();
box.set("Hello");
System.out.println(box.get()); //"Hello"
</pre>



<p>このコードは「<code>Box</code>というクラスの中で、<strong>あとから使う型（T）を自由に指定できる</strong>ようにしている」という仕組みです。※　<code>T</code> というのは、<strong>仮の型名（型のプレースホルダー）</strong>です。</p>



<ul class="wp-block-list">
<li><code>Box&lt;T&gt;</code>：これは「<strong>このBoxはT型のデータを扱います</strong>」という意味。</li>



<li><code>private T data;</code>：データを入れる変数 <code>data</code> は、<strong>T型ですよ〜</strong> という意味。</li>



<li><code>set(T data)</code>：引数として <strong>T型のデータ</strong> を受け取って、保存。</li>



<li><code>get()</code>：保存された <strong>T型のデータ</strong> を返す。</li>
</ul>



<p>つまり「<strong>このクラスはTという型を扱う、型付きの箱（Box）</strong>」ということ。<code>Box&lt;String&gt;</code> と書いた時点で「<strong>T = String</strong>」と明確に決まるので、String型のメソッドが自由に使えるようにもなります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Box&lt;String> box = new Box&lt;>();
box.set("こんにちは");

String value = box.get();
System.out.println(value.length());      // 出力: 5
System.out.println(value.toUpperCase()); // 出力: コンニチハ
System.out.println(value.contains("にち")); // 出力: true
</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ジェネリクスを使用することで、型の安全性を向上させ、明示的なキャストを減らすことができます。これにより、コードが簡潔になり、バグの発生を防ぐことができます。特にコレクションを扱う際は、ジェネリクスを積極的に活用しましょう。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">List&lt;>と class A&lt;> の違いが直感的に理解できない・・・</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>はい、「書き方は似ていても、役割・立場が違う」という点で、<code>List&lt;></code> と <code>class A&lt;></code> は少し別物と考えるのは正しいです。</p>
</div></dd></dl></div>



<p>&#x2705; 結論：</p>



<ul class="wp-block-list">
<li><code>List&lt;E></code> は <strong>「使う側（利用者）が型を指定するクラス」</strong></li>



<li><code>class A&lt;T></code> は <strong>「作る側（設計者）が型をあとから入れられるように設計するクラス」</strong></li>
</ul>



<p>&#x1f50d; 順を追って説明</p>



<p><strong>① <code>List&lt;String></code> の意味は？</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">List&lt;String> names = new ArrayList&lt;>();
</pre>



<p>→ これは<strong>すでにジェネリクスで作られているクラスを「使う側」</strong>の立場で使っています。</p>



<ul class="wp-block-list">
<li><code>List&lt;E></code> は Javaの標準ライブラリで定義されたインターフェース。</li>



<li><code>E</code> は「Element（要素）」の意味。</li>



<li><code>List&lt;String></code> というのは、「このリストにはString型しか入れません」という制約を**「使うときに」指定している**。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>② <code>class A&lt;T></code> の意味は？</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class A&lt;T> {
    T value;
}
</pre>



<p>→ これは「クラスを作る側」の視点です。</p>



<ul class="wp-block-list">
<li>「このクラスはどんな型でも扱えるように設計しておきたいな」</li>



<li>「使うときに好きな型を入れてもらおう」</li>



<li>→ そういうときに「型パラメータ <code>T</code>」を使う</li>
</ul>



<p>つまり、型を自由に差し込める「テンプレート」として <code>class A&lt;T></code> を作っているわけです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>&#x1f4cc; まとめ表</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>比較項目</th><th>List&lt;String&gt;</th><th>class A&lt;T&gt;</th></tr></thead><tbody><tr><td>立場</td><td><strong>使う側</strong></td><td><strong>作る側</strong></td></tr><tr><td>目的</td><td>決められた型パラメータに具体的な型を入れる</td><td>型パラメータを用いて柔軟なクラスを設計する</td></tr><tr><td>役割</td><td>ジェネリクスクラスの「利用」</td><td>ジェネリクスクラスの「定義」</td></tr><tr><td>型はいつ決まる？</td><td>宣言時に決める（例：<code>List&lt;String&gt;</code>）</td><td>使うときに決まる（例：<code>new A&lt;Integer&gt;()</code>）</td></tr></tbody></table></div></figure>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>java.lang.Comparableを初心者向けに1からわかりやすく</title>
		<link>https://it-biz.online/java/java-lang-comparable/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 22 Apr 2025 09:03:37 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10343</guid>

					<description><![CDATA[java.lang.Comparableとは、Javaで「オブジェクト同士を比較して並び替えるための基準」を定めるためのインターフェースです。これを使えば、自分で作ったオブジェクトを簡単に並び替えたり、順序付けしたりでき [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><code>java.lang.Comparable</code>とは、Javaで「<strong>オブジェクト同士を比較して並び替えるための基準</strong>」を定めるためのインターフェースです。これを使えば、自分で作ったオブジェクトを簡単に並び替えたり、順序付けしたりできます。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/java/java-interface/">インターフェースとは？わかりやすく３分で解説</a></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Comparableとは？</a><ol><li><a href="#toc2" tabindex="0">Step①: クラスを作る</a></li><li><a href="#toc3" tabindex="0">Step②: Comparableを実装する</a></li></ol></li><li><a href="#toc4" tabindex="0">実際に並び替えをしてみよう（サンプルコード付き）</a></li><li><a href="#toc5" tabindex="0">Comparatorとの違いを知ろう</a><ol><li><a href="#toc6" tabindex="0">Comparatorの使い方も知っておこう（応用編）</a></li><li><a href="#toc7" tabindex="0">Comparableを使うメリット</a></li></ol></li><li><a href="#toc8" tabindex="0">注意点（初心者がよく間違うポイント）</a></li><li><a href="#toc9" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Comparableとは？</span></h2>



<p>プログラムでは「数値」や「文字列」の並び替えがよく行われます。数字なら「小さい順」「大きい順」、文字なら「あいうえお順」など、誰でも簡単にできますよね。</p>



<p>しかし、自分で作ったクラス（例えば人間、車、本）を並び替えるには、<strong>何を基準にするかを明確に決める必要があります</strong>。このときに役立つのが、Java標準のインターフェース「Comparable」です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Comparableの基本的な使い方を理解するために、独自のクラスを定義して、そのクラスで並び順を変えるところまでを順を追って説明していきます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">Step①: クラスを作る</span></h3>



<p>例えば「人間」というクラスを作ります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person {
    String name; // 名前
    int age;     // 年齢

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
</pre>



<h3 class="wp-block-heading"><span id="toc3">Step②: Comparableを実装する</span></h3>



<p>「年齢で並べたい」とき、次のようにComparableを実装します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Person implements Comparable&lt;Person> {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // これが比較を行うためのルールを決めるメソッド
    // 「Personクラスのインスタンス同士を、年齢（age）を使って比較する」
    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}
</pre>



<p><code>Comparable</code>インターフェースは「<strong><span class="marker-under">並べ替えのルールを定めるために、<code>compareTo()</code>の実装を必須とする契約</span></strong>」です。この実装（ルール）に従って、<code>Collections.sort()</code>などがオブジェクトを並び替える、というイメージです。</p>



<p>1個1個整理しますね。</p>



<ul class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>Comparableインターフェースの目的</strong>
<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin">「このクラスのインスタンスを、自然な順序（natural order）で比較・並び替えできるようにする」ためのインターフェース。</li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>compareToメソッドの役割</strong>
<ul class="wp-block-list">
<li>シグネチャは <code><span class="blue">int compareTo(T other)</span></code></li>



<li>戻り値の意味：
<ul class="wp-block-list">
<li>負の値：<code>this</code> が <code>other</code> より小さい</li>



<li>0：同じ</li>



<li>正の値：<code>this</code> が <code>other</code> より大きい</li>
</ul>
</li>



<li><strong><span class="marker-under">ここに「並べ替えのルール」を書きます</span></strong>（例：年齢順、辞書順など）。</li>
</ul>
</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>ルールを実装する流れ</strong>
<ul class="wp-block-list">
<li>クラス宣言で <code><span class="blue">implements Comparable&lt;YourClass></span></code> を付与</li>



<li><code>compareTo()</code> をオーバーライドし、比較ロジックを記述</li>



<li>これでそのクラスは「Comparableなオブジェクト」となる</li>
</ul>
</li>



<li><strong>ルールに従った並び替え</strong>
<ul class="wp-block-list">
<li><code>Collections.sort(listOfYourClass);</code></li>



<li><code>Arrays.sort(arrayOfYourClass);</code></li>



<li>上記を呼ぶと、<span class="marker-under">自動的に <code>compareTo()</code> を使って順序付け</span>される</li>
</ul>
</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Java標準ライブラリ（OpenJDK）のソースから抜粋すると、<code>java.lang.Comparable</code> は非常にシンプルに定義されていることが分かります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">package java.lang;

/**
 * This interface imposes a total ordering on the objects of each
 * class that implements it.
 */
public interface Comparable&lt;T> {
    /**
     * Compares this object with the specified object for order.
     * @param  o the object to be compared.
     * @return a negative integer, zero, or a positive integer
     *         as this object is less than, equal to, or greater than the specified object.
     */
    int compareTo(T o);
}
</pre>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">実際に並び替えをしてみよう（サンプルコード付き）</span></h2>



<p>先ほど定義したPersonクラスを用いて実際に並び替えを行うコードを見てみましょう。以下は複数の人を年齢順に並べ替える例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import java.util.*;

public class Main {
    public static void main(String[] args) {
        List&lt;Person> people = new ArrayList&lt;>();
        people.add(new Person("佐藤", 25));
        people.add(new Person("鈴木", 20));
        people.add(new Person("高橋", 30));

        // 年齢順で並び替え
        Collections.sort(people);

        // 並び替えた結果を表示
        for (Person person : people) {
            System.out.println(person.name + " (" + person.age + ")");
        }
    }
}

/* 出力
鈴木 (20)
佐藤 (25)
高橋 (30) */</pre>



<p>年齢の若い順に表示されます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>けど、なんで？っていうのをちょっとだけ深堀しておきます。</p>
</div></div>



<p>この1行：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Collections.sort(people);
</pre>



<p>が<strong>なぜ並び替えをしてくれるのか</strong>の裏側の流れを見てみます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="has-text-align-center">&#x1f501; <strong>流れを順を追って説明</strong></p>



<p><span class="badge-blue">ステップ①</span><strong> <code>Collections.sort()</code> を呼ぶ</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Collections.sort(people);
</pre>



<p>これは、<strong>リストの中身を昇順（小さい順）に並び替える</strong>メソッドです。<br>ただし、「どう並び替えるか（ルール）」は <span class="marker-under"><code>Comparable</code> インターフェースの <code>compareTo()</code> に頼っています。</span></p>



<p><span class="badge-blue">ステップ②</span> <strong>内部で <code>List.sort(null)</code> が呼ばれる</strong></p>



<p>List.sort(null)の中身を見ると、実はこうなっています：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public static &lt;T extends Comparable&lt;? super T>> void sort(List&lt;T> list) {
    list.sort(null); // Comparator が null だと \"自然順序\" でソート
}
</pre>



<p>これをやさしく言い換えると「<code>T</code>は、<strong>自分自身か親クラスと比較できる能力（Comparable）を持った型</strong>でなければいけませんよ。そのリストを自然な順序で並べ替えます」ということ。<code><span class="blue">&lt;T extends Comparable&lt;? super T>></span></code>の部分が肝でこれは<strong><a href="https://it-biz.online/java/java-generics/">ジェネリクス</a>の型制約</strong>と呼ばれます。</p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>部分</th><th>説明</th></tr></thead><tbody><tr><td><code>T</code></td><td>Listに入っている要素の型（たとえば <code>Person</code>）</td></tr><tr><td><code>Comparable&lt;? super T&gt;</code></td><td><code>T</code> またはその親クラスと比較できるという意味。<strong>共変性を許すための工夫</strong>です。</td></tr></tbody></table></div></figure>



<p>そして、リストの要素（この場合は <code>Person</code>）が <strong><code>Comparable</code> を実装していれば</strong>、その <code>compareTo()</code> メソッドが呼び出されます。このとき内部ではこんな処理が行われています：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">for (int i = 0; i &lt; list.size(); i++) {
    for (int j = i + 1; j &lt; list.size(); j++) {
        if (list.get(i).compareTo(list.get(j)) > 0) {
            // 要素を交換する（大きければ後ろに）
        }
    }
}
</pre>



<p>要するに <code>compareTo()</code> を使って<strong>2つのオブジェクトを比較し、順番を入れ替えている</strong>わけです。<code>Collections.sort(people);</code> だけで並び替えができる理由は：</p>



<ol class="wp-block-list">
<li>Personが <code>Comparable</code> を実装していて</li>



<li><code>compareTo()</code> で「年齢順に並べる」と明確に書かれており</li>



<li>Javaが内部で <code>compareTo()</code> を何度も呼びながら順番を整えてくれる</li>
</ol>



<p>という仕組みがあるからです。つまり、「<strong>compareToが並び替えのルールブックになっていて、Javaがそれを読んで並び替えている</strong>」と考えてOKです！</p>



<h2 class="wp-block-heading"><span id="toc5">Comparatorとの違いを知ろう</span></h2>



<p>Javaにはもう1つ「Comparator」という似た仕組みがあります。</p>



<ul class="wp-block-list">
<li><strong>Comparable</strong><br>自然な順序（通常の並べ方）をクラス自体が決定する場合に使います。</li>



<li><strong>Comparator</strong><br>並び順を外側で自由に決めたい場合に使います（例えば名前順、年齢順などその都度変更する場合）。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">Comparatorの使い方も知っておこう（応用編）</span></h3>



<p>先ほどの「人」の例で、今度は名前順に並べたい場合、Comparatorを使います。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import java.util.*;

public class Main {
    public static void main(String[] args) {
        List&lt;Person> people = new ArrayList&lt;>();
        people.add(new Person("佐藤", 25));
        people.add(new Person("鈴木", 20));
        people.add(new Person("高橋", 30));

        // 名前順に並べ替え
        people.sort(new Comparator&lt;Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.name.compareTo(p2.name);
            }
        });

        for (Person person : people) {
            System.out.println(person.name + " (" + person.age + ")");
        }
    }
}

/* 出力
佐藤 (25)
鈴木 (20)
高橋 (30) */</pre>



<p>今度は名前の50音順に並びました。</p>



<h3 class="wp-block-heading"><span id="toc7">Comparableを使うメリット</span></h3>



<ul class="wp-block-list">
<li><strong>わかりやすい</strong>：クラス自身がどのように並ぶかを決めているため、コードが読みやすいです。</li>



<li><strong>使いやすい</strong>：Javaの配列やリストのソート機能がそのまま使えます。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc8">注意点（初心者がよく間違うポイント）</span></h2>



<ul class="wp-block-list">
<li><code>compareTo</code>メソッドを使うとき、数字を単純に引き算すると、整数オーバーフローを起こすことがあります。安全な方法は常に <code>Integer.compare(a, b)</code> を使うことです。</li>
</ul>



<p>例：</p>



<p>良くない例：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">return this.age - other.age; // オーバーフローの可能性あり
</pre>



<p>安全な例：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">return Integer.compare(this.age, other.age); // 安全
</pre>



<h2 class="wp-block-heading"><span id="toc9">まとめ</span></h2>



<ul class="wp-block-list">
<li>Comparableはオブジェクトの自然な順序を決定するための仕組み</li>



<li>compareTo()で比較方法を定義</li>



<li>Comparatorと使い分けることで、様々な並び替えが可能</li>



<li>基本を押さえて、安全な書き方を心掛けることが大事</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】内部クラス（nested class）の仕組みを３分でわかりやすく</title>
		<link>https://it-biz.online/java/inner-class/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 21 Apr 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10329</guid>

					<description><![CDATA[内部クラス（nested class）は、その名の通りJavaのクラスの中に定義された別のクラスのことを指します（箱の中に小さな箱が入っているようなイメージ）。大きく分けて以下の4つの種類があり、場面に応じた適切な使い分 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>内部クラス（nested class）は、その名の通りJavaの<a href="https://it-biz.online/java/java-oop/">クラス</a>の<strong>中に定義された別のクラス</strong>のことを指します（箱の中に小さな箱が入っているようなイメージ）。大きく分けて以下の4つの種類があり、場面に応じた適切な使い分けが求められます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>インナークラス (Inner Class)</strong>: <br>クラスのメンバ（フィールドやメソッド）と同じように定義されるクラス。インスタンスメンバとして扱われるため、外側のクラスのインスタンスを通してのみインスタンス化できます。外側のクラスのprivateメンバにもアクセスできるのが特徴。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>staticネストクラス (Static Nested Class)</strong>: <br>クラス内に、<a href="https://it-biz.online/java/java-static/"><code>static</code>修飾子</a>をつけて定義されたクラス。外側のクラスのインスタンスがなくてもインスタンス化でき、静的メンバのように振る舞います。外側のクラスの静的メンバにはアクセスできますが、インスタンスメンバには直接アクセスできません。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>ローカルクラス (Local Class)</strong>: <br>メソッドやコンストラクタ、<a href="https://it-biz.online/java/java-initializer-block/">イニシャライザ</a>などのブロック内で定義されるクラス。そのブロック内でのみ有効で、外側のクラスのメンバや、そのブロックのfinalまたはeffectively finalなローカル変数にアクセスできます。名前を持たない匿名クラスとは異なり、名前を持つことができます。</li>



<li><strong>匿名クラス (Anonymous Class)</strong>: <br>名前を持たないクラスで、クラスの宣言と同時にインスタンス化されるクラス。主に、インターフェースや抽象クラスを実装したり、クラスを継承したりする際に、その場で簡単な処理を記述するために使われます。ローカルクラスと同様に、外側のクラスのメンバや、そのブロックのfinalまたはeffectively finalなローカル変数にアクセスできます。</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページでは、上記4種類のJavaの内部クラスについて、初心者の方にも分かりやすいように解説していきます。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【前提】クラスとスコープをおさらい</a><ol><li><a href="#toc2" tabindex="0">なぜ“クラスの中にクラス”が必要か</a></li></ol></li><li><a href="#toc3" tabindex="0">インナークラス (Inner Class)</a></li><li><a href="#toc4" tabindex="0">staticネストクラス (Static Nested Class)</a></li><li><a href="#toc5" tabindex="0">ローカルクラス (Local Class)</a></li><li><a href="#toc6" tabindex="0">匿名クラス (Anonymous Class)</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【前提】クラスとスコープをおさらい</span></h2>



<p>「クラス」はデータ（フィールド）と振る舞い（メソッド）を束ねる設計図で、「インスタンス」はその具体物です。</p>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="710" height="255" src="https://it-biz.online/wp-content/uploads/2024/05/image-30.png" alt="クラスとインスタンスの概念" class="wp-image-9958" srcset="https://it-biz.online/wp-content/uploads/2024/05/image-30.png 710w, https://it-biz.online/wp-content/uploads/2024/05/image-30-500x180.png 500w, https://it-biz.online/wp-content/uploads/2024/05/image-30-300x108.png 300w" sizes="(max-width: 710px) 100vw, 710px" /><figcaption class="wp-element-caption">図1：クラスとインスタンスの概念</figcaption></figure>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/java/java-oop/">クラスとインスタンスの基本概念を１から</a></p>



<p>Javaではクラス宣言の内側にさらに別のクラスを記述することが許されており、これを<strong>ネストクラス（入れ子クラス）</strong>と呼びます。トップレベルクラスと異なり、<strong><span class="marker-under">スコープ（見える範囲）が外側クラスの内部に限定される点が最大の特徴です。</span></strong></p>



<h3 class="wp-block-heading"><span id="toc2">なぜ“クラスの中にクラス”が必要か</span></h3>



<p><span class="inline-button-white-green">理由１</span>　<strong>「外側のクラスと強く関係する処理」をまとめたいから</strong></p>



<p>たとえば<code>Button</code>クラスがあって、そのボタンの「クリックイベント処理」を表す<code>ClickListener</code>クラスがあるとします。この<code>ClickListener</code>は他の用途には使いませんし、<code>Button</code>とセットで使うのが当然です。<br>だったら、<strong>わざわざ別ファイルに分けるより、中に書いた方が読みやすくて自然</strong>ですよね？</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>「このクラスはこの中でしか使わない」<br>→ <strong>なら中に書けばいいじゃないか！</strong></p>
</blockquote>



<p><span class="inline-button-white-green">理由２</span>　<strong>「外側の状態（フィールド）を安全に共有」できるから</strong></p>



<p>インナークラスは、<strong>外側クラスのprivateフィールドにアクセス可能</strong>です。通常、<code>private</code>な情報は外から見えませんが、<strong>内部にいるクラスだからこそ見られる</strong>、という特徴を持ちます。<br>外側に余計なgetterを生やさなくていいという意味でも、安全な設計にすることが可能になります。</p>



<p><span class="inline-button-white-green">理由３</span>　<strong>「外に見せたくない構造を隠せる」から</strong></p>



<p>クラスを外部ファイルに出すと、他の人や他のクラスからもアクセスされる可能性があります。でも内部クラスなら、<strong>完全に外側クラスの一部として、スコープを制限できます。</strong><br>「このロジックはこのクラス専用だよ」と<strong>明確な意図をコード上に示せる</strong>のが大きなメリットです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>つまり内部クラスは「関係が強く、独立性が低い」クラスのための居場所っていうイメージです。以下のような設計上の目的を果たすために、Javaは内部クラスという仕組みを提供しているとまずは理解しておきましょう。</p>



<ul class="wp-block-list">
<li><strong>ロジックのまとまり（凝集度）を保つ</strong></li>



<li><strong>外部への漏洩を防ぐ（情報隠蔽）</strong></li>



<li><strong>コードの可読性・保守性を上げる</strong></li>
</ul>
</div></div>



<p>ここからは１個１個の内部クラスの特徴や注意点について解説します。</p>



<h2 class="wp-block-heading"><span id="toc3">インナークラス (Inner Class)</span></h2>



<p>インナークラスは、<strong><span class="marker-under">外側のクラスの「メンバー」として定義される内部クラス</span></strong>です。これは、クラスの中にあるフィールド（変数）やメソッド（関数）と同じような立ち位置だと考えると分かりやすいです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Outer {
    private int outerField = 10;

    class Inner {
        public void innerMethod() {
            // 外側のprivateメンバにアクセス
            System.out.println("Outerのフィールドの値: " + outerField);
        }
    }

    public void createInnerAndCall() {
        // 外側のクラスから内部クラスのインスタンスを作成
        Inner inner = new Inner();
        inner.innerMethod();
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        // 出力: Outerのフィールドの値: 10
        outer.createInnerAndCall();

        // 外側のクラスのインスタンスを通して、内部クラスのインスタンスを作成
        Outer.Inner innerInstance = outer.new Inner();
        // 出力: Outerのフィールドの値: 10
        innerInstance.innerMethod();
    }
}</pre>



<p>この例では、<code>Outer</code>クラスの中に<code>Inner</code>クラスが定義されています。<code>Inner</code>クラスの<code>innerMethod</code>メソッドは、外側の<code>Outer</code>クラスの<code>private</code>なフィールドである<code>outerField</code>にアクセスすることが可能。また、<code>Inner</code>クラスのインスタンスを作成する際には、まず<code>Outer</code>クラスのインスタンス (<code>outer</code>) を作り、それを通して <code><span class="blue">outer.new Inner()</span></code> のようにして作成します。</p>



<p class="has-text-align-center"><span class="inline-button-green">特徴</span></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>インスタンスに紐づく:</strong> <br>インナークラスのインスタンスを作るには、前提として外側クラスのインスタンスが必要です。</li>



<li><strong>外側のクラスのメンバにアクセス可能:</strong> <br>インナークラスからは、外側のクラスのprivateなメンバを含むすべてのメンバ）に自由にアクセスすることが可能です。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">staticネストクラス (Static Nested Class)</span></h2>



<p>staticネストクラスは、<strong><span class="marker-under"><code>static</code>キーワードをつけて定義された内部クラス</span></strong>です。これは外側のクラスのインスタンスに直接紐付かず、独立して存在できる点がインナークラスとは異なります。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/java/java-static/" title="【Java】static の意味と使い方を３分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/07/image-5-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/07/image-5-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/07/image-5-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/07/image-5-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Java】static の意味と使い方を３分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">Javaのstaticキーワードの使い方を徹底解説！メモリ効率の向上や便利なユーティリティメソッドの提供、共通データの管理を簡単にするためのポイントを、サンプルコード付きで初心者向けにわかりやすく説明します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.13</div></div></div></div></a>
</div></figure>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class OuterStatic {
    private static int staticOuterField = 20;
    private int instanceOuterField = 30;

    static class InnerStatic {
        public void innerStaticMethod() {
            // 静的メンバにアクセス
            System.out.println("OuterStaticの静的フィールドの値: " + staticOuterField);
            // エラー！インスタンスメンバにはアクセスできない
            // System.out.println("OuterStaticのインスタンスフィールドの値: " + instanceOuterField); 
        }
    }

    public static void main(String[] args) {
        // 外側のクラスのインスタンスなしで、staticネストクラスのインスタンスを作成
        OuterStatic.InnerStatic innerStatic = new OuterStatic.InnerStatic();
        // 出力: OuterStaticの静的フィールドの値: 20
        innerStatic.innerStaticMethod();
    }
}</pre>



<p>この例では、<code>OuterStatic</code>クラスの中に<code>static</code>修飾子が付いた<code>InnerStatic</code>クラスが定義されています。<code>InnerStatic</code>クラスの<code>innerStaticMethod</code>メソッドは、外側の<code>OuterStatic</code>クラスの<code>static</code>なフィールドである<code>staticOuterField</code>にアクセスできていますが、インスタンスフィールドである<code>instanceOuterField</code>にはアクセスしようとするとエラーになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>staticなメソッドはstaticではないメンバへのアクセスができない、という意味でJavaの原理原則と一致しており、不自然なルールではありません。</p>
</div></div>



<p>尚、staticネストクラスのインスタンスは、<code><span class="blue">OuterStatic.InnerStatic innerStatic = new OuterStatic.InnerStatic();</span></code> のように、外側のクラス名を指定して直接作成できます。</p>



<p class="has-text-align-center"><span class="inline-button-blue">イメージ</span></p>



<p>大きな家の敷地内にある、独立した小さな小屋（staticネストクラス）を想像してください。小屋は家の一部ではありますが、家の主人（外側のクラスのインスタンス）がいなくても存在できます。ただし、小屋からは家の中の共有スペース（外側のクラスのstaticなメンバ）は見えますが、個人の部屋（外側のクラスのインスタンスメンバ）には直接入ることはできません。</p>



<p class="has-text-align-center"><span class="inline-button-green">特徴</span></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>外側のクラスのインスタンスが不要:</strong> <br>staticネストクラスのインスタンスは、外側のクラスのインスタンスがなくても直接作成できます。</li>



<li><strong>外側のクラスの静的メンバにのみアクセス可能:</strong> <br>staticネストクラスからは、外側のクラスの<code>static</code>なフィールドやメソッドに直接アクセスできますが、<code>static</code>でないインスタンスメンバにはアクセスできません。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">ローカルクラス (Local Class)</span></h2>



<p>ローカルクラスは、<strong><span class="marker-under">メソッドや<a href="https://it-biz.online/java/java-constructor/">コンストラクタ</a>などの特定のブロックの中で定義されるクラス</span></strong>です。その定義されたブロック内でのみ有効で、外からはアクセスできません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ブロック内のみで有効→つまり、ローカルクラスにはアクセス修飾子を付ける必要がない→アクセス修飾子を付けるとコンパイルエラーになります。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class OuterLocal {
    private int outerField = 40;

    public void outerMethod() {
        // finalまたはeffectively finalである必要がある
        int localVariable = 50; 

        class LocalInner {
            public void localInnerMethod() {
                // 外側のメンバにアクセス
                System.out.println("Outerのフィールドの値: " + outerField);
                // finalまたはeffectively finalなローカル変数にアクセス
                System.out.println("ローカル変数の値: " + localVariable);
            }
        }

        LocalInner localInner = new LocalInner();
        // 出力: Outerのフィールドの値: 40, ローカル変数の値: 50
        localInner.localInnerMethod();
    }

    public static void main(String[] args) {
        OuterLocal outer = new OuterLocal();
        outer.outerMethod();
    }
}</pre>



<p class="has-text-align-center"><span class="inline-button-blue">イメージ</span></p>



<p>あなたが一時的に借りた部屋（メソッドなどのブロック）の中で、その部屋の中だけで使うための小さな道具（ローカルインナークラス）を作るようなイメージです。その道具は部屋の外には持ち出せませんし、他の部屋の人が使うこともありません。</p>



<p class="has-text-align-center"><span class="inline-button-green">特徴</span></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>定義されたブロック内でのみ有効:</strong> <br>ローカルクラスは、それが定義されたメソッドなどのブロックが終わると、その存在は消えます。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>外側のクラスのメンバにアクセス可能:</strong> <br>ローカルクラスからは、外側のクラスのすべてのメンバ（<code>private</code>を含む）にアクセスできます。</li>



<li><strong>ブロック内のfinalまたはeffectively finalなローカル変数にアクセス可能:</strong> <br>ローカルクラスが定義されているメソッドなどのブロック内のローカル変数にアクセスする場合、その変数は<code>final</code>であるか、実質的に<code>final</code>（一度代入された後、値が変更されない）である必要があります。</li>
</ul>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">なぜ、ローカルクラスは、ローカル変数にアクセスする際にそれが <code>final</code> であるか、実質的に <code>final</code> である必要がある？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Javaのメモリ管理と変数のライフサイクルが深く関わっています。</p>



<p><strong>理由を理解するためのステップ:</strong></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>ローカル変数のライフサイクル:</strong> <br>メソッドが実行されると、そのメソッド内で宣言されたローカル変数はスタック領域に確保されます。メソッドの処理が終わると、これらのローカル変数はスタックから解放され、消滅します。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>ローカルインナークラスのインスタンスのライフサイクル:</strong> <br>一方、ローカルクラスのインスタンスは、それが定義されたメソッドの実行が終了した後も、<strong>ヒープ領域に生き残る可能性があります</strong>。例えば、ローカルクラスのインスタンスが、メソッドの外の別のオブジェクトに渡されたり、保持されたりする場合です。</li>



<li><strong>データの不整合のリスク:</strong> <br>もしローカルイクラスが、メソッド終了後に消滅する可能性のあるローカル変数を直接参照できたとすると、以下のようなデータの不整合が起こりえます。
<ul class="wp-block-list">
<li>メソッドが終了し、ローカル変数がメモリから解放される。</li>



<li>しかし、ローカルクラスのインスタンスはまだ生き残っており、解放されたメモリ領域を参照しようとする。→これは危険な状態です。</li>
</ul>
</li>
</ol>



<p><strong>Javaの解決策:</strong></p>



<p>Javaは、この問題を避けるために、ローカルクラスがアクセスするローカル変数を <code>final</code> または実質的に <code>final</code> にすることを要求しています。</p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong><code>final</code> 変数の場合:</strong> <br><code>final</code> 変数は一度値が代入されると変更できないため、ローカルクラスが参照する値は常に一定です。メソッドの実行が終了しても、ローカルクラスのインスタンスが参照する値は不変であることが保証されます。</li>



<li><strong>実質的に <code>final</code> な変数の場合:</strong> <br>実質的に <code>final</code> な変数は、宣言後に一度だけ代入されるか、全く代入されずに使用される変数です。コンパイラは、これらの変数が事実上 <code>final</code> であると認識し、<code>final</code> 変数と同様に扱います。これにより、コードの柔軟性を保ちつつ、データの不整合のリスクを回避できます。</li>
</ul>
</div></dd></dl></div>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class OuterLocalExtended {
    private int outerField = 40;

    public LocalInner getLocalInnerInstance() {
        // finalまたはeffectively finalである必要がある
        int localVariable = 50;

        class LocalInner {
            public void localInnerMethod() {
                System.out.println("Outerのフィールドの値: " + outerField);
                System.out.println("ローカル変数の値: " + localVariable);
            }
        }
        // LocalInnerのインスタンスをメソッドの外に返す
        return new LocalInner();
    }

    public static void main(String[] args) {
        OuterLocalExtended outer = new OuterLocalExtended();
        // メソッド終了後にインスタンスを受け取る
        LocalInner instance = outer.getLocalInnerInstance();
        // ... 何らかの処理 ...
        // メソッド終了後にローカル変数にアクセスしようとする（実際にはコピーを参照）
        instance.localInnerMethod(); 
    }
}
</pre>



<p>この例では、<code>getLocalInnerInstance</code> メソッド内で <code>LocalInner</code> のインスタンスが作成され、メソッドの戻り値として外に渡されます。<code>main</code> メソッドでは、<code>getLocalInnerInstance</code> の実行が終了した後も、<code>LocalInner</code> のインスタンス (<code>instance</code>) が存在し続ける可能性があります。</p>



<p>もし <code>localVariable</code> が <code>final</code> でなかった場合、<code>getLocalInnerInstance</code> メソッドが終了し、スタック上の <code>localVariable</code> が解放された後も、<code>instance</code> がその解放されたメモリ領域を参照しようとする危険性があります。これは、プログラムのクラッシュや予期しない動作を引き起こす可能性があります。</p>



<p><strong><span class="marker-under"><code>final</code> または実質的に <code>final</code> であることで、ローカルクラスのインスタンスが生成された時点で、参照するローカル変数の値がコピーされ、そのコピーがインスタンス内に保持されます。</span></strong>そのため、元のローカル変数がメソッド終了時に消滅しても、コピーされた値は安全にアクセスできるということになります。</p>



<h2 class="wp-block-heading"><span id="toc6">匿名クラス (Anonymous Class)</span></h2>



<p>匿名クラスは、<strong><span class="marker-under">名前を持たないクラス</span></strong>で、クラスの宣言と同時にそのインスタンスが作成されます。主に、<a href="https://it-biz.online/java/java-interface/">インターフェース</a>を実装したり、<a href="https://it-biz.online/java/java-extends/">クラスを継承</a>したりする際に、その場で簡単な処理を記述するために使われます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">interface Greeting {
    void greet(String name);
}

class OuterAnonymous {
    private String message = "Hello, ";

    public void performGreeting(String personName) {
        // 匿名クラスを使ってGreetingインターフェースを実装
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void greet(String name) {
                // 外側のメンバにアクセス
                System.out.println(message + name);
            }
        };
        // 出力: Hello, Taro
        anonymousGreeting.greet(personName);
    }

    public static void main(String[] args) {
        OuterAnonymous outer = new OuterAnonymous();
        outer.performGreeting("Taro");
    }
}</pre>



<p>この例では、<code>Greeting</code>というインターフェースを、<code>performGreeting</code>メソッドの中で匿名クラスを使って実装しています。<strong><code>new Greeting() { ... }</code> の部分が匿名クラスの定義とインスタンス化を同時に行っている箇所です</strong>。匿名クラスの中の<code>greet</code>メソッドでは、外側の<code>OuterAnonymous</code>クラスの<code>message</code>フィールドにアクセスしています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>匿名クラスも、メソッド内で定義しているクラスなので、ローカルクラスと同様でアクセス修飾子を付けるとコンパイルエラーが発生します。</p>
</div></div>



<p class="has-text-align-center"><span class="inline-button-blue">イメージ</span></p>



<p>例えるなら、注文したケーキ屋さんで、その場で簡単なデコレーション（匿名クラスによる処理の実装）を加えてもらうようなイメージです。デコレーションの名前はないけれど、その場でケーキに特別な機能を追加できます。</p>



<p class="has-text-align-center"><span class="inline-button-green">特徴</span></p>



<ul class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>名前がない:</strong> <br>クラス定義に名前がありません。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>宣言と同時にインスタンス化:</strong> <br><code>new インターフェース名()</code> または <code>new スーパークラス名()</code> のようにして、その場でクラスの定義とインスタンスの作成を同時に行います。</li>



<li><strong>外側のクラスのメンバやfinal/effectively finalなローカル変数にアクセス可能:</strong> <br>ローカルインナークラスと同様のアクセスルールを持ちます。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>匿名クラスについては少し理解しづらい部分があると思います。以下のページでより詳しく解説しておりますので、合わせてご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/java/anonymous-class/" title="【Java】匿名クラスとは？１分でわかりやすく使いどころを解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2025/04/image-4-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2025/04/image-4-320x180.png 320w, https://it-biz.online/wp-content/uploads/2025/04/image-4-240x135.png 240w, https://it-biz.online/wp-content/uploads/2025/04/image-4-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">【Java】匿名クラスとは？１分でわかりやすく使いどころを解説</div><div class="blogcard-snippet internal-blogcard-snippet">Javaの匿名クラスについて、基本的な書き方から使いどころ、ラムダ式との違いまでを初心者にもわかりやすく解説します。一度きりの実装に便利な匿名クラスのメリット・注意点も紹介。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.07</div></div></div></div></a>
</div></figure>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Javaコマンド（javacとは？）の基本を3分でわかりやすく</title>
		<link>https://it-biz.online/java/java-command/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 05 Mar 2025 08:41:02 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9841</guid>

					<description><![CDATA[Javaは「Write Once, Run Anywhere（1度書けばどこでも動く）」という思想のもと誕生したプログラミング言語です。その中核にはJava仮想マシン（JVM）が存在し、コンパイルされたバイトコードをどの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Javaは「Write Once, Run Anywhere（1度書けばどこでも動く）」という思想のもと誕生したプログラミング言語です。その中核にはJava仮想マシン（JVM）が存在し、コンパイルされたバイトコードをどのOS上でも同じように実行する仕組みが備わっています。（<span class="badge">参考</span> <a href="https://it-biz.online/java/java-setup/">JDK/JRE/JVMの仕組みを１から解説</a>）</p>



<p>このページでは、Javaの基本コマンドである<code><span class="bold-blue">javac</span></code>・<code><span class="blue">java</span></code>・<code><span class="blue">jar</span></code>の使い方を１からわかりやすく解説しつつ、Java 9で導入されたモジュールシステムやJava 11の<strong>ソースファイルモード</strong>にも触れていきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>さらに、クラスローダ・JITコンパイラ・GCなど、JVMの裏側にある奥深い仕組みにも言及しながら、読んでいて「Javaって実は面白い！」と思える記事にしていますので、是非最後までご覧ください。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">コンパイルと実行（javacとjava）</a><ol><li><a href="#toc2" tabindex="0">ソースコードの準備とコンパイル（javac）</a></li><li><a href="#toc3" tabindex="0">実行（java）</a></li></ol></li><li><a href="#toc4" tabindex="0">java/javacコマンドのオプション</a></li><li><a href="#toc5" tabindex="0">Javaコマンドの3つの実行形態 + ソースファイルモード</a><ol><li><a href="#toc6" tabindex="0">mainメソッドを持つクラスファイル</a></li><li><a href="#toc7" tabindex="0">jarファイル内のメインクラス</a></li><li><a href="#toc8" tabindex="0">モジュールに含まれるメインクラス（Java 9～）</a></li><li><a href="#toc9" tabindex="0">Java 11のソースファイルモード</a></li></ol></li><li><a href="#toc10" tabindex="0">jarコマンドの応用：アプリケーションのパッケージング</a><ol><li><a href="#toc11" tabindex="0">jarファイルの基本</a></li><li><a href="#toc12" tabindex="0">実行可能jarとマニフェストファイル</a></li></ol></li><li><a href="#toc13" tabindex="0">応用設定：クラスパスとJVMオプション</a><ol><li><a href="#toc14" tabindex="0">クラスパス（classpath）の指定</a></li><li><a href="#toc15" tabindex="0">JVM起動オプション（メモリ・デバッグ）</a></li></ol></li><li><a href="#toc16" tabindex="0">Javaの裏側の仕組み</a><ol><li><a href="#toc17" tabindex="0">クラスローダ</a></li><li><a href="#toc18" tabindex="0">JITコンパイラ</a></li><li><a href="#toc19" tabindex="0">ガーベジコレクション（GC）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">コンパイルと実行（javacとjava）</span></h2>



<p>まずは基本となるコンパイルと、コンパイルしたバイトコード（classファイル）の実行コマンドから解説します。</p>



<h3 class="wp-block-heading"><span id="toc2">ソースコードの準備とコンパイル（javac）</span></h3>



<figure class="wp-block-image aligncenter size-full"><img loading="lazy" decoding="async" width="798" height="326" src="https://it-biz.online/wp-content/uploads/2024/05/image-1.png" alt="Javac,Javaコンパイラ" class="wp-image-9144" srcset="https://it-biz.online/wp-content/uploads/2024/05/image-1.png 798w, https://it-biz.online/wp-content/uploads/2024/05/image-1-500x204.png 500w, https://it-biz.online/wp-content/uploads/2024/05/image-1-300x123.png 300w, https://it-biz.online/wp-content/uploads/2024/05/image-1-768x314.png 768w" sizes="(max-width: 798px) 100vw, 798px" /><figcaption class="wp-element-caption">図1：Java/コンパイル</figcaption></figure>



<p>Javaのプログラムはソースコード（.javaファイル）を<strong>コンパイル</strong>してバイトコード（.classファイル）に変換する作業が必要です。たとえば、<span class="blue">HelloWorld.java</span>に下記のようなクラスを定義したとします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}
</pre>



<p>これをコンパイルするには、次のコマンドを実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">javac HelloWorld.java
</pre>



<p>同じフォルダ内に<code><span class="blue">HelloWorld.class</span></code>が生成されます。これが<strong>バイトコード</strong>です。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p><strong>裏側の仕組み</strong></p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><code>javac</code>はJavaソースを内部的に“抽象構文木”へ変換し、そこからJVMが解釈できる命令セット（バイトコード）へ落とし込みます。</li>



<li><code>.class</code>ファイルには定数プールやメソッド情報などが含まれており、実行に必要な情報がコンパクトに格納されます。</li>
</ul>
</div>



<h3 class="wp-block-heading"><span id="toc3">実行（java）</span></h3>



<p>生成されたバイトコードを実行する際には、<strong><span class="marker-under">拡張子を付けずにクラス名を指定</span></strong>します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java HelloWorld
</pre>



<p>これで「Hello, World!」と表示されれば成功です。</p>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-check block-box">
<p><strong>裏側の仕組み</strong></p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li><code>java</code>コマンドで指定されたクラスをJVMが読み込み、まずクラスローダによって<code>.class</code>ファイルをロードします。</li>



<li>その後、インタプリタがバイトコードを1命令ずつ解釈して実行しますが、高頻度で呼び出されるコードはJITコンパイラによってネイティブコードへ最適化され、高速化します。</li>



<li>こうした仕組みにより、「Write Once, Run Anywhere」が実現されています。</li>
</ul>
</div>



<h2 class="wp-block-heading"><span id="toc4">java/javacコマンドのオプション</span></h2>



<p><code>javac</code> は Java ソースコード（<code>.java</code>ファイル）をバイトコード（<code>.class</code>ファイル）にコンパイルするためのコマンドでした。最もシンプルな使い方は、<code>javac ファイル名.java</code> で、同じディレクトリに <code>.class</code> ファイルが生成するだけですが、以下のオプションを使うことで様々な対応が可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">javac [オプション] ソースファイル
java [オプション] クラスファイル
</pre>



<p class="has-text-align-center"><strong><code>javac</code> の代表的なオプション一覧</strong></p>



<figure class="wp-block-table aligncenter"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>オプション</th><th>説明</th><th>使用例</th></tr></thead><tbody><tr><td><strong>-d</strong> <em>ディレクトリ</em></td><td>コンパイル結果（<code>.class</code>ファイル）の出力先ディレクトリを指定します。<br>指定しない場合は、現在のディレクトリに出力されます。</td><td><code>javac -d out Hello.java</code><br>→ <code>out/</code> に <code>.class</code> を出力</td></tr><tr><td><strong>-classpath</strong> (または <strong>-cp</strong>)</td><td>クラスパスを指定します。<br>他のクラスやJARファイルが配置されているディレクトリやライブラリを指定するときに使います。</td><td><code>javac -cp lib/mylib.jar Main.java</code></td></tr><tr><td><strong>-sourcepath</strong> <em>パス</em></td><td>ソースファイルを探すディレクトリを指定します。<br>複数ディレクトリを指定する場合はOSに合わせて区切ります (例：<code>;</code> や <code>:</code>)。</td><td><code>javac -sourcepath src src/Main.java</code></td></tr><tr><td><strong>-encoding</strong> <em>文字コード</em></td><td>ソースファイルのエンコーディングを指定します。<br>日本語コメントや文字列リテラルを含む場合に文字化けを防ぐのに便利です。</td><td><code>javac -encoding UTF-8 Hello.java</code></td></tr><tr><td><strong>-source</strong> <em>バージョン</em></td><td>ソースコードのバージョンを指定します。<br>例：<code>-source 11</code> → Java 11の言語仕様に準拠してコンパイル。</td><td><code>javac -source 11 Hello.java</code></td></tr><tr><td><strong>-target</strong> <em>バージョン</em></td><td>出力するバイトコードのバージョン（互換性）を指定します。<br>例：<code>-target 8</code> → Java 8 で動作する <code>.class</code> を生成。</td><td><code>javac -source 11 -target 8 Hello.java</code></td></tr><tr><td><strong>-Xlint</strong></td><td>コンパイラの警告（lint）を制御します。<br><code>-Xlint:unchecked</code> など。<br><code>-Xlint:all</code> で全警告を表示。</td><td><code>javac -Xlint:all Hello.java</code></td></tr><tr><td><strong>-parameters</strong></td><td>メソッドのパラメータ名をバイトコードに埋め込みます。（リフレクションで名前を取得できる）</td><td><code>javac -parameters Main.java</code></td></tr><tr><td><strong>-verbose</strong></td><td>コンパイル時に処理内容を詳細表示します。<br>どのファイルがコンパイルされるかなどを確認可能。</td><td><code>javac -verbose Hello.java</code></td></tr><tr><td><strong>-version</strong></td><td>javac のバージョン情報を表示します。（ソースのコンパイルは行いません）</td><td><code>javac -version</code></td></tr><tr><td><strong>-help</strong></td><td>javac のヘルプメッセージ（使用できる全オプション）を表示します。</td><td><code>javac -help</code></td></tr><tr><td><strong>-proc</strong> <em>ポリシー</em></td><td>アノテーション処理（アノテーション・プロセッサ）の動作を指定します。<br><code>-proc:only</code> でアノテーション処理のみ実行し、ソースはコンパイルしないなど。</td><td><code>javac -proc:only MyAnnotatedClass.java</code></td></tr></tbody></table></div></figure>



<ol class="wp-block-list">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>出力先を指定してコンパイルする</strong> <br><code>javac <span class="blue">-d</span> out MyProgram.java</code></li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>複数のソースファイルを一括コンパイル</strong> <br><code>javac <span class="blue">-encoding UTF-8 -d</span> out src/<span class="bold-red">*</span>.java</code></li>



<li><strong>外部ライブラリを使う場合（クラスパス指定）</strong> <br><code>javac <span class="blue">-cp lib/some-library.jar -d out</span> src/MyApp.java</code>
<ul class="wp-block-list">
<li><code>some-library.jar</code> のクラスを参照しながらコンパイル</li>



<li><code>MyApp.class</code> は <code>out/</code> に出力される</li>
</ul>
</li>



<li><strong>Javaのバージョンを指定してコンパイルする</strong><br><code>javac -source 11 -target 8 MyLegacyApp.java</code>
<ul class="wp-block-list">
<li>ソースは Java 11 の構文チェック</li>



<li>バイトコードは Java 8 向けに出力</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">クラスパスとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>クラスパス（<strong>classpath</strong>）とは、<strong>Javaがクラス（.classファイル）を探す場所を指定する仕組み</strong>。</p>
</div></dd></dl></div>



<h2 class="wp-block-heading"><span id="toc5">Javaコマンドの3つの実行形態 + ソースファイルモード</span></h2>



<p>Javaプログラムを<code>java</code>コマンドで実行する方法は、大きく<strong>3つ</strong>存在します。さらに、Java 11からは<strong>ソースファイルモード</strong>というシンプルな実行形態も加わりました。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>mainメソッドを持つクラスファイル</strong></li>



<li><strong>jarファイル内のメインクラス</strong></li>



<li><strong>モジュールに含まれるメインクラス</strong></li>



<li><span class="blue">（Java 11～）</span><strong>ソースファイルモード</strong></li>
</ol>



<p>以下では、これらの違いや使い分けを確認していきます。</p>



<h3 class="wp-block-heading"><span id="toc6">mainメソッドを持つクラスファイル</span></h3>



<p>もっともシンプルで伝統的な実行形態です。すでに紹介したHelloWorldのように、<code>main(String[] args)</code>を持つクラスを<code><span class="blue">javac</span></code>でコンパイル後、<code><span class="blue">java クラス名</span></code>で起動する方法です。</p>



<ul class="wp-block-list">
<li><strong>メリット</strong>: 設定が不要で手軽</li>



<li><strong>デメリット</strong>: 配布やライブラリ管理の段階になると、クラスファイルをまとめる必要が出てくる</li>
</ul>



<h3 class="wp-block-heading"><span id="toc7">jarファイル内のメインクラス</span></h3>



<p>複数のクラスファイルやリソースをまとめたアーカイブファイル（<code>.jar</code>形式）を生成し、<code>Main-Class</code>を指定することで、<code>java -jar</code>コマンドで実行可能にできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">1 manifest.txtなどでメインクラスを指定
Main-Class: com.example.app.HelloWorld

2 jarコマンドでアーカイブを作成
jar cfm HelloWorld.jar manifest.txt com/example/app/*.class

3 実行
java -jar HelloWorld.jar
</pre>



<p>これにより、配布やバージョン管理が容易になり、システム全体の保守性が向上します。</p>



<h3 class="wp-block-heading"><span id="toc8">モジュールに含まれるメインクラス（Java 9～）</span></h3>



<p>Java 9で導入されたモジュールシステム（Project Jigsaw）は、大規模化したJavaアプリケーションにおけるパッケージ管理をより厳密に行う仕組みです。</p>



<ul class="wp-block-list">
<li><code>module-info.java</code>でモジュール名やエクスポートするパッケージ、依存モジュールなどを宣言します。</li>



<li>実行時はモジュールパスとメインモジュール・メインクラスを指定します。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java --module-path mods -m com.example.app/com.example.app.HelloWorld
</pre>



<ul class="wp-block-list">
<li><code>-module-path</code>でモジュールを配置したディレクトリを指定</li>



<li><code>-m</code>オプションで「モジュール名/メインクラス」を指定</li>
</ul>



<p>モジュール同士の依存関係やアクセス制御を明確化し、ライブラリの衝突などを防ぎやすくなるのが大きな利点です。</p>



<h3 class="wp-block-heading"><span id="toc9">Java 11のソースファイルモード</span></h3>



<p>Java 11からは、<strong>単一のソースファイル</strong>であればコンパイルを明示せずに直接実行できるようになりました。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java HelloWorld.java
</pre>



<p>これだけでコンパイルと実行を一括で行います。スクリプト感覚で試験的なコードを書くときや、学習用途にはとても便利です。</p>



<p><strong><span class="inline-button-red">注意</span></strong>: 大規模開発や複数クラスが絡む場合は、従来どおりコンパイル→実行またはIDEのプロジェクト構成が一般的です。あくまでも“単体ファイル”に限り便利な機能である、と理解しましょう。</p>



<h2 class="wp-block-heading"><span id="toc10">jarコマンドの応用：アプリケーションのパッケージング</span></h2>



<h3 class="wp-block-heading"><span id="toc11">jarファイルの基本</span></h3>



<p><code>jar</code>はZIP形式をベースにしたアーカイブで、クラスファイルやリソースをひとまとめにできます。</p>



<ul class="wp-block-list">
<li>配布が容易になり、classpathにjarファイルを追加するだけでアプリケーションが動作するようにできます。</li>



<li><code>META-INF/MANIFEST.MF</code>にメインクラスやクラスパス情報を記述することで、<code>java -jar</code>形式の実行ファイルを構築可能です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">実行可能jarとマニフェストファイル</span></h3>



<p>たとえば以下のように、メインクラスを指定した<code>manifest.txt</code>を準備します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Main-Class: com.example.app.HelloWorld
</pre>



<p>このファイルを用いてjarを作成すると、</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">jar cfm HelloWorld.jar manifest.txt com/example/app/*.class
</pre>



<p>すると、</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java -jar HelloWorld.jar
</pre>



<p>でメインメソッドが呼び出され、アプリが起動します。</p>



<h2 class="wp-block-heading"><span id="toc13">応用設定：クラスパスとJVMオプション</span></h2>



<h3 class="wp-block-heading"><span id="toc14">クラスパス（classpath）の指定</span></h3>



<p>外部ライブラリを使う場合など、Javaがクラスファイルやライブラリを探しに行くパスを指定する必要があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">javac -cp ./libs/*:. MyApp.java
java -cp ./libs/*:. MyApp
</pre>



<ul class="wp-block-list">
<li><code>.</code>は現在のディレクトリ</li>



<li><code>:</code>はパス区切り文字（Windowsでは<code>;</code>）</li>



<li><code>./libs/*</code> でlibsフォルダ内のJARすべてを指定</li>
</ul>



<h3 class="wp-block-heading"><span id="toc15">JVM起動オプション（メモリ・デバッグ）</span></h3>



<ul class="wp-block-list">
<li><code>-Xms</code> <code>-Xmx</code>: ヒープメモリの初期サイズ・最大サイズを指定（例：<code>-Xms512m -Xmx1024m</code>）</li>



<li>リモートデバッグ:</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 MyApp
</pre>



<p>指定ポートにデバッガを接続すればブレークポイントを張ってステップ実行が可能です。</p>



<h2 class="wp-block-heading"><span id="toc16">Javaの裏側の仕組み</span></h2>



<h3 class="wp-block-heading"><span id="toc17">クラスローダ</span></h3>



<p>Javaではクラスローダが複数階層になっており、標準ライブラリを読み込む<strong>ブートストラップクラスローダ</strong>、ユーザのクラスパスを参照する<strong>システムクラスローダ</strong>などが段階的にクラスを探します。</p>



<ul class="wp-block-list">
<li>パッケージ名に対応するディレクトリ構造を辿って<code>.class</code>ファイルをロード</li>



<li>モジュールシステム利用時はモジュールパスを優先的に参照</li>
</ul>



<h3 class="wp-block-heading"><span id="toc18">JITコンパイラ</span></h3>



<p>JVMは実行時にバイトコードをインタプリタで実行するだけでなく、<strong>JITコンパイラ</strong>によって頻繁に呼ばれるメソッドをネイティブコードに変換します。</p>



<ul class="wp-block-list">
<li>これにより、Javaアプリは起動直後こそ遅めでも、使い込むうちに高速化が期待できます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc19">ガーベジコレクション（GC）</span></h3>



<p>メモリ管理を自動化するJavaの大きな特徴です。</p>



<ul class="wp-block-list">
<li>ヒープ内の不要オブジェクトをGCが検知し、自動的にメモリを再利用</li>



<li>GCアルゴリズム（Serial GC, Parallel GC, G1 GC, ZGCなど）をアプリケーション特性に合わせて選択可能</li>



<li>メモリリークの心配は軽減される一方、開発者がGCタイミングを完全に制御することは難しい</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】静的バインディングと動的バインディングをわかりやすく</title>
		<link>https://it-biz.online/java/java-binding/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Sat, 19 Apr 2025 02:20:29 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10320</guid>

					<description><![CDATA[Javaにおける「静的バインディング」と「動的バインディング」という言葉は、初心者にとって少しとっつきにくく感じられるかもしれません。これらは継承が関わるときにだけ登場する話です。 たとえば、Animal a = new [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>この記事のゴール</strong>: 「変数は型で決まり、メソッドは場合によって実体で決まる」——この 1 行を実感として理解する。</p>
</div>



<p>Javaにおける「静的バインディング」と「動的バインディング」という言葉は、初心者にとって少しとっつきにくく感じられるかもしれません。これらは<a href="https://it-biz.online/java/java-extends/">継承</a>が関わるときにだけ登場する話です。</p>



<p>たとえば、<code>Animal a = new Dog();</code> のように、<strong>親クラスの変数に子クラスのインスタンスを代入</strong>したとき、Javaは「変数を見るべきか？」「実体を見るべきか？」という判断をしなければなりません。このとき、</p>



<ul class="wp-block-list">
<li>変数（フィールドや static メソッド）は「型（参照型）」で判断される → <strong>静的バインディング</strong></li>



<li>インスタンスメソッド（オーバーライドされる可能性があるもの）は「中身（実体型）」で判断される → <strong>動的バインディング</strong></li>
</ul>



<p>というルールが働くのです。</p>



<p>つまり、継承＋<a href="https://it-biz.online/it-skills/polymorphism/">多態性（ポリモーフィズム）</a>の文脈で初めて「バインディング」という言葉が意味を持ちます。この記事ではその仕組みを、丁寧に・図解やサンプルコード付きで解説していきます。</p>



<p>動的バインディングと静的バインディングの違いは、<strong>「メソッドや変数の呼び先が、いつ決まるか」</strong>です。</p>



<ul class="wp-block-list">
<li><strong>静的バインディング</strong>：コンパイル時に決まる（例：変数、static メソッド）</li>



<li><strong>動的バインディング</strong>：実行時に決まる（例：オーバーライドされたメソッド）</li>
</ul>



<p>たとえば、<code>Animal a = new Dog();</code> のとき、<code>a.name</code> は静的に <code>Animal</code> のものが使われ、<code>a.speak()</code> は動的に <code>Dog</code> のものが呼ばれる、というのがこのページで解説したい内容です。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><tbody><tr><th>バインディング</th><th>決まるタイミング</th><th>決め手</th><th>主な対象</th></tr><tr><td>静的 (static)</td><td><strong>コンパイル時</strong>（プログラムを実行用に変換するとき）</td><td>変数宣言の <strong>型</strong></td><td>フィールド, <code>static</code> / <code>private</code> / <code>final</code> メソッド, オーバーロード</td></tr><tr><td>動的 (dynamic)</td><td><strong>実行時</strong>（プログラムが動いている最中）</td><td>オブジェクトの <strong>実体</strong></td><td>オーバーライドしたインスタンスメソッド</td></tr></tbody></table></div></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-text-align-center"><span class="badge-blue">ポイント</span>　<strong>覚え方</strong></p>



<ul class="wp-block-list">
<li><strong>F</strong>ield と <strong>S</strong>tatic は <strong>S</strong>tatic バインディング。</li>



<li>残ったインスタンスメソッドは動的バインディング。</li>
</ul>
</blockquote>



<p>これだけでも問題は解けます。以下で仕組みをゆっくり深掘りしましょう。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">静的バインディング ― 型を見て早決め</a><ol><li><a href="#toc2" tabindex="0">なぜコンパイル時に決められる？</a></li></ol></li><li><a href="#toc3" tabindex="0">動的バインディング ― 実体を見て後決め</a><ol><li><a href="#toc4" tabindex="0">ざっくり内部図</a></li></ol></li><li><a href="#toc5" tabindex="0">初期化順序トラップ（null が出る理由）</a></li><li><a href="#toc6" tabindex="0">オーバーロードは静的、ボクシングはその次</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">静的バインディング ― 型を見て早決め</span></h2>



<p>静的バインディングとは、「<strong>コンパイル時に呼び先が決まる処理</strong>」のことです。<br>Javaでは次のようなケースが静的バインディングになります。</p>



<ul class="wp-block-list">
<li><strong>フィールド（変数）</strong></li>



<li><strong><code>static</code> メソッド</strong></li>



<li><strong><code>private</code> や <code>final</code> なメソッド</strong></li>



<li><strong>オーバーロード（同名で引数違い）</strong></li>
</ul>



<p>これらは<strong>変数の型（参照型）</strong>を見てコンパイル時に呼び先が決まるので、実行時に変わることはありません。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Animal {
    String kind = "Animal";
    static void hello() { System.out.println("Hello from Animal"); }
}
class Dog extends Animal {
    String kind = "Dog";
    static void hello() { System.out.println("Hello from Dog"); }
}
Animal a = new Dog();
System.out.println(a.kind); // ①
a.hello();                  // ②</pre>



<ul class="wp-block-list">
<li><strong>①</strong> <code>kind</code> は変数なので 型 <code><strong>Animal</strong></code> を参照 → "Animal"。</li>



<li><strong>②</strong> <code>hello()</code> は <code>static</code> メソッドなので型を参照 → "Hello from Animal"。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc2">なぜコンパイル時に決められる？</span></h3>



<p>コンパイラは上のコードを見ると「<code>kind</code> は <code>Animal</code> で offset いくつ」「<code>hello()</code> は <code>Animal</code> のメモリアドレスいくつ」とバイトコードに固定します。プログラムが動くときに変更される可能性がないため最速です。</p>



<h2 class="wp-block-heading"><span id="toc3">動的バインディング ― 実体を見て後決め</span></h2>



<p>動的バインディングとは、「<strong>実行時に呼び先が決まる処理</strong>」のことです。<br>Java では、<strong>オーバーライドされたインスタンスメソッド</strong>に対して動的バインディングが行われます。</p>



<p>これは、<strong>変数の型（参照型）ではなく、実際の中身（実体型）</strong>を見て、実行時にどのメソッドを使うかを判断する仕組みです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Animal {
    void speak() { System.out.println("..."); }
}

class Dog extends Animal {
    @Override void speak() { System.out.println("Bowwow"); }
}

Animal a = new Dog();
a.speak(); // → Bowwow（実体が Dog なので）
</pre>



<ul class="wp-block-list">
<li><code>speak()</code> はオーバーライド可能なインスタンスメソッド。</li>



<li>実行時に JVM が「実体は Dog だ」と判断し、Dog 版の <code>speak()</code> を呼びます。</li>
</ul>



<p>このように、<strong>実行時に実体のクラスを探して処理を決める</strong>ため、「多態性（ポリモーフィズム）」が実現できます。<br>Java の柔軟性の根幹を支える仕組みです。</p>



<h3 class="wp-block-heading"><span id="toc4">ざっくり内部図</span></h3>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Animal a → ヒープ内 Dog オブジェクト → Dog のメソッド表 (v‑table) → Dog.speak()</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>JVM はこのメソッド表を O(1) で検索するので速度ロスは最小。</p>
</blockquote>



<h2 class="wp-block-heading"><span id="toc5">初期化順序トラップ（null が出る理由）</span></h2>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">class Parent {
  Parent() { show(); }
  void show() { System.out.println("Parent"); }
}
class Child extends Parent {
  String name = "Child";
  @Override void show() { System.out.println(name); }
}
new Child(); // → null</pre>



<ol start="1" class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><code>Parent</code> コンストラクタ内で <code>show()</code> 呼び出し。</li>



<li>動的バインディングで Child の <code>show()</code> が走る。</li>



<li>しかし <code>name</code> まだ初期化前 → <code>null</code>。</li>
</ol>



<p>試験では <strong>「なぜ </strong><code><strong>null</strong></code><strong> になる？」</strong> を説明できれば OK です。</p>



<h2 class="wp-block-heading"><span id="toc6">オーバーロードは静的、ボクシングはその次</span></h2>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">static void f(int x)     { System.out.println("int"); }
static void f(Integer x) { System.out.println("Integer"); }
static void f(int... xs) { System.out.println("varargs"); }

f(5);                // int  ← 一番ぴったり
f(Integer.valueOf(5)); // Integer</pre>



<p>可変長引数は “最後の手段” なので出番は少なめ。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】String.intern()とStringPoolの基本を1分で</title>
		<link>https://it-biz.online/java/string-intern/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 09 Apr 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10240</guid>

					<description><![CDATA[intern()は「文字列プールの中にその文字列があればそれを返し、なければ追加して返す」メソッドです。 Javaには同じ文字列が何度も使われることを想定して、メモリのムダをなくす工夫があります。それが「文字列プール（S [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>intern()は「<strong><span class="marker-under">文字列プールの中にその文字列があればそれを返し、なければ追加して返す</span></strong>」メソッドです。</p>



<p>Javaには同じ文字列が何度も使われることを想定して、<strong>メモリのムダをなくす</strong>工夫があります。それが「<strong>文字列プール（String Pool）</strong>」です。<code>intern()</code>メソッドは、このプールと関係しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Javaの文字列リテラルと文字列プールとは？</a></li><li><a href="#toc2" tabindex="0">new String()を使うと何が起こる？</a></li><li><a href="#toc3" tabindex="0">intern()の役割とは？</a></li><li><a href="#toc4" tabindex="0">intern()を使うと何がうれしいの？</a><ol><li><a href="#toc5" tabindex="0">&#x2705; メモリ効率が良くなる</a></li><li><a href="#toc6" tabindex="0">&#x2705; ==で比較できるようになる</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Javaの文字列リテラルと文字列プールとは？</span></h2>



<p>Javaでは、文字列を <code>"apple"</code> のようにダブルクオーテーションで書いたものを<strong>文字列リテラル</strong>と呼びます。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/java/java-literals/">リテラルの基本概念</a></p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String s = "apple";
</pre>



<p>このように書かれた文字列は、<strong><span class="marker-under">文字列プール（String Pool）</span></strong>という特別な場所に自動で保存されます。文字列プールとは、<strong>同じ文字列を一度だけ保存しておく場所、そしてそれを使いまわす仕組み</strong>です。</p>



<p>つまり、同じ <code>"apple"</code> を何度使っても、<strong>同じ1つのインスタンスを共有</strong>することで、メモリの節約しよう！という考え方です。</p>



<h2 class="wp-block-heading"><span id="toc2">new String()を使うと何が起こる？</span></h2>



<p>次のようなコードを書いたとします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String s = new String("apple");
</pre>



<p>このとき、<code>"apple"</code> というリテラルはプールに登録されますが、<code>new String(...)</code> は<strong>新しいインスタンスをヒープ領域に作成</strong>します。つまり、↑のコードは内部で次の２つの処理が行われています：</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>リテラル部分 <code>"apple"</code>：</strong><br>ソースコード中の文字列リテラルは、クラスがロードされる際に自動的に文字列プールに登録されます。つまり、この時点で <code>"apple"</code> は既にプール内に存在することになります。</li>



<li><strong>new String("apple")：</strong><br><code>new String(...)</code> は、<span class="marker-under">プールにあるリテラル <code>"apple"</code> を元にして<strong>ヒープ上に新しい</strong> String オブジェクトを生成</span>します。<br>※ この新たなオブジェクトはプールに登録されず、ヒープ上の独立した存在です。</li>
</ol>



<p>比較するとこうなります：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String s1 = "apple";                  // プール上の"apple"
String s2 = new String("apple");     // ヒープ上の新しい"apple"

System.out.println(s1 == s2); // false（参照が異なる）
</pre>



<h2 class="wp-block-heading"><span id="toc3">intern()の役割とは？</span></h2>



<p><code>intern()</code>メソッドを使うと、次のような動作をします：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>「この文字列と<strong>同じ内容の文字列が文字列プールにあるか</strong>を確認し、あればそれを返す。なければ<strong>プールに登録して返す</strong>」</p>
</blockquote>



<p>つまり、<code>new String(...)</code> のように<strong>ヒープに作られた文字列も、プールにある文字列と結びつけられる</strong>のです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String s1 = "apple";
String s2 = new String("apple");
String s3 = s2.intern();

System.out.println(s1 == s2); // false（ヒープとプールで違う）
System.out.println(s1 == s3); // true（どちらもプール）
</pre>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>リテラル "apple":</strong><br>クラスロード時に文字列プールに登録される（自動で管理される）。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><strong>new String("apple"):</strong><br>ヒープ上に新しいオブジェクトを生成。内部で使われているリテラルはプールされているが、<span class="marker-under">この新オブジェクト自体はプールには入りません。</span></li>



<li><strong>new String("apple").intern():</strong><br>プール内に既に "apple" があるので、その参照が返される（= リテラル "apple" と同じインスタンス）。</li>
</ol>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">「この文字列と同じ内容の文字列が文字列プールにあるかを確認し、あればそれを返す。なければプールに登録して返す」ということだけど、後半の「なければプールに登録して返す」というパターンはどんなパターン？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class InternDemo {
    public static void main(String[] args) {
        // ランタイム構築で、まだプールに "xyz" がないケース
        String built = new StringBuilder()
                          .append('x')
                          .append('y')
                          .append('z')
                          .toString();
        
        // まだ同じ内容のリテラルをコード中に書いていないので…
        String interned1 = built.intern();
        
        System.out.println("built == interned1? " + (built == interned1));
        // → true （built オブジェクト自身がプールに登録されて返る）
        
        // ２回目の intern() は、既にプール登録済みを返す
        String interned2 = new StringBuilder()
                              .append('x')
                              .append('y')
                              .append('z')
                              .toString()
                              .intern();
        System.out.println("interned1 == interned2? " + (interned1 == interned2));
        // → true （同じプール内のインスタンスを返す）
    }
}
</pre>
</div></dd></dl></div>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><code>built</code> は文字列リテラルではなく、<code>new StringBuilder()</code> で動的生成した文字列。</li>



<li><code>built.intern()</code> を呼ぶと、プールに <code>"xyz"</code> が存在しないため、<code>built</code> 自身がプールに登録され、その参照を返します。</li>



<li>以後、同じ内容 <code>"xyz"</code> を持つ文字列を <code>intern()</code> すると、プール内の同じオブジェクトが返されます。</li>
</ol>



<h2 class="wp-block-heading"><span id="toc4">intern()を使うと何がうれしいの？</span></h2>



<h3 class="wp-block-heading"><span id="toc5">&#x2705; メモリ効率が良くなる</span></h3>



<p>同じ文字列を何度も使っている場合、それぞれが別のインスタンスだとメモリがムダになります。<code>intern()</code>を使えば1つにまとめられます。</p>



<h3 class="wp-block-heading"><span id="toc6">&#x2705; ==で比較できるようになる</span></h3>



<p>Javaでは<code>==</code>は「中身」ではなく「参照（場所）」の比較です。<code>intern()</code>でプールに統一しておけば、<strong>中身が同じ文字列は同じ参照になる</strong>ため、<code>==</code>で比較できるようになります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】レコード（record）の基本を１からわかりやすく</title>
		<link>https://it-biz.online/java/java-record/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 25 Feb 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9751</guid>

					<description><![CDATA[目次 Java：レコード（record）の概要レコードが解決しようとしている問題レコードの基本構文：recordフィールドの取り扱い（アクセサメソッド）レコードがもたらす利点ボイラープレートの削減不変オブジェクトとしての [&#8230;]]]></description>
										<content:encoded><![CDATA[
<ul class="wp-block-list is-style-icon-list-circle has-list-style">
<li><strong>レコード（record）</strong> は、主にデータを格納・転送するための軽量なクラスです。</li>



<li>従来のクラスのように <code><span class="blue">equals()</span></code> や <code><span class="blue">hashCode()</span></code>, <code><span class="blue">toString()</span></code> を自分で書かなくても、自動的に作ってくれます。</li>



<li>データを単純に持ち運びたいだけなら、従来のクラスよりもずっと短いコードで済みます。</li>
</ul>



<div class="wp-block-cocoon-blocks-tab-box-1 blank-box bb-tab bb-hint block-box">
<p>最初に気になるのが、<strong>「レコード」</strong>（英語では “record”）と呼ばれるものを「レコードクラス」と呼んでいる説明もあれば、「record」とだけ呼ぶ場合もあります。</p>



<ul class="wp-block-list">
<li><strong>結論</strong>としては、Java公式ドキュメントや仕様書においては <strong>"Record Classes"</strong> という用語が使われています。</li>



<li>ただし実際にコードを書くときのキーワードは <span class="blue"><code>record</code> </span>です。</li>



<li>「レコードクラス」という呼び方は、Javaにおけるクラスの一種であることを強調する表現ですし、「レコード」と略して呼ぶのも広く浸透しています。要するに、<strong>「recordクラス」「レコードクラス」「レコード」</strong>のどれを使っても、基本的には同じ機能を指していると思ってOKです。</li>
</ul>



<p>ただし、「レコード」と言った場合に、データベースの行（レコード）を想像する人もいるでしょうから、Java言語仕様として正式に呼ぶときは「レコードクラス (Record Classes)」という名前が正確だと捉えておけば安心です。</p>
</div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Java：レコード（record）の概要</a><ol><li><a href="#toc2" tabindex="0">レコードが解決しようとしている問題</a></li></ol></li><li><a href="#toc3" tabindex="0">レコードの基本構文：record</a><ol><li><a href="#toc4" tabindex="0">フィールドの取り扱い（アクセサメソッド）</a></li></ol></li><li><a href="#toc5" tabindex="0">レコードがもたらす利点</a><ol><li><a href="#toc6" tabindex="0">ボイラープレートの削減</a></li><li><a href="#toc7" tabindex="0">不変オブジェクトとしての設計</a></li><li><a href="#toc8" tabindex="0">「意図」が明確化される</a></li></ol></li><li><a href="#toc9" tabindex="0">レコードを使う際の注意点</a><ol><li><a href="#toc10" tabindex="0">イミュータブルであること</a></li><li><a href="#toc11" tabindex="0">継承はできない</a></li><li><a href="#toc12" tabindex="0">参照型フィールドの取り扱い</a></li></ol></li><li><a href="#toc13" tabindex="0">コンストラクタ周りの詳細</a><ol><li><a href="#toc14" tabindex="0">カノニカルコンストラクタ</a></li><li><a href="#toc15" tabindex="0">コンパクトコンストラクタ</a></li></ol></li><li><a href="#toc16" tabindex="0">レコードの活用例</a><ol><li><a href="#toc17" tabindex="0">DTO（データ転送オブジェクト）としての利用</a></li><li><a href="#toc18" tabindex="0">Web APIレスポンスの格納</a></li><li><a href="#toc19" tabindex="0">小規模な値オブジェクトの表現</a></li></ol></li><li><a href="#toc20" tabindex="0">レコードの制限事項・よくある疑問</a><ol><li><a href="#toc21" tabindex="0">サブクラスは作れない？</a></li><li><a href="#toc22" tabindex="0">equals(), hashCode(), toString()のカスタマイズはどうなる？</a></li><li><a href="#toc23" tabindex="0">レコードの可変フィールドは？</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Java：レコード（record）の概要</span></h2>



<p>Javaでは長らく<strong>「データのやり取りに使うだけのクラス」</strong>を定義するのが煩雑でした。たとえば、DTO（Data Transfer Object）やValue Object（値オブジェクト）として、単に名前や年齢などのフィールドだけ持つクラスを定義したい場合にでも、以下のようなメソッドを書き足す必要がありました。</p>



<ul class="wp-block-list">
<li>コンストラクタ</li>



<li>getter/setter</li>



<li>equals() / hashCode()</li>



<li>toString()</li>
</ul>



<p>「全部自動生成してしまえば一瞬じゃないか」と思うかもしれませんが、ツールやIDEの機能を活用しても、何らかの手間はどうしてもつきまといます。そこで、Java言語においても「<strong>冗長なコードを削減し、単純にデータを表現するのに特化したクラスが欲しい</strong>」という要望が高まりました。</p>



<p>その結果として、Java 14（プレビュー）で初登場し、Java 16で正式導入されたのが<strong>レコード（record）</strong>です。</p>



<h3 class="wp-block-heading"><span id="toc2">レコードが解決しようとしている問題</span></h3>



<p>レコードの最大の目的は「<strong>ボイラープレートコード（決まりきった定型コード）の削減</strong>」にあります。特にDTO用途で「単にデータを保持しているだけ」という構造を明示化し、かつメソッドの自動生成をしてくれます。結果として、<strong>コード量が減り、ソースが読みやすくなる</strong>効果が期待できます。</p>



<p>また、レコードは不変（イミュータブル）な設計を前提とするため、<strong>値オブジェクト的な使い方</strong>を推奨している点も大きな特徴です。</p>



<h2 class="wp-block-heading"><span id="toc3">レコードの基本構文：record</span></h2>



<p>レコードクラスを宣言するには <span class="blue"><code>record</code> </span>キーワードを使います。例えば、次のように書くと、名前（String）と年齢（int）を持つレコードを定義できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record Person(String name, int age) {
}
</pre>



<p>ポイントとなるのは、<strong><span class="marker-under">括弧内の引数が、そのままレコードのフィールドとして扱われる</span></strong>ことです。上記の宣言だけで、以下のものが自動生成されます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin"><code>private final String name;</code></li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><code>private final int age;</code></li>



<li class="is-style-bottom-margin-1em has-bottom-margin">すべてのフィールドを受け取る<strong><a href="https://it-biz.online/java/java-constructor/">コンストラクタ</a></strong></li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><code>name()</code> / <code>age()</code> という<strong>アクセサメソッド</strong>（getter相当）</li>



<li><code>equals()</code> / <code>hashCode()</code> / <code>toString()</code></li>
</ol>



<p>実際に内部的に自動生成されるのが↓。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public final class Person extends java.lang.Record {
    private final String name;
    private final int age;

    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // アクセサ（getter）
    public String name() {
        return name;
    }

    public int age() {
        return age;
    }

    // equals
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person other = (Person) o;
        return age == other.age &amp;&amp; java.util.Objects.equals(name, other.name);
    }

    // hashCode
    @Override
    public int hashCode() {
        return java.util.Objects.hash(name, age);
    }

    // toString
    @Override
    public String toString() {
        return "Person[name=" + name + ", age=" + age + "]";
    }
}
</pre>



<p>ご覧のように、内部的にはjava.lang.Recordを<a href="https://it-biz.online/java/java-extends/">継承</a>したfinalなクラスとして定義され、同時に各種フィールドや必要なコンストラクタ・メソッドが定義される、という仕組みです。<strong>ひとまず↑のコードが理解できれば、レコードクラスに関する基本は抑えられたと思ってOK！</strong></p>



<h3 class="wp-block-heading"><span id="toc4">フィールドの取り扱い（アクセサメソッド）</span></h3>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>内部的にはフィールド名と同じメソッドが使えるようになるので・・・以下のようにフィールドを参照することができます。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Person person = new Person("Alice", 20);

System.out.println(person.name()); // "Alice"
System.out.println(person.age());  // 20
</pre>



<p><strong>getterの代わりに<span class="marker-under">「フィールド名と同じメソッド」が生成される</span></strong>のがレコードの特徴です。なお、レコードの場合は「setter」がありません。※レコードは基本的に不変オブジェクト（後述）を想定しているため。</p>



<h2 class="wp-block-heading"><span id="toc5">レコードがもたらす利点</span></h2>



<h3 class="wp-block-heading"><span id="toc6">ボイラープレートの削減</span></h3>



<p>先ほど述べたように、レコードでは<strong>getter, equals, hashCode, toStringなどを自分で書かなくて済む</strong>のが最大の利点です。ちょっとしたDTOをたくさん定義したいとき、余計なコードの量が削減され、メンテナンス性も上がります。</p>



<p>もともと↓のように記載していたのが、たった1～2行で定義できちゃいます、というのがレコードクラスの美味しいところです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public final class Person extends java.lang.Record {
    private final String name;
    private final int age;

    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // アクセサ（getter）
    public String name() {
        return name;
    }

    public int age() {
        return age;
    }

    // equals
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person other = (Person) o;
        return age == other.age &amp;&amp; java.util.Objects.equals(name, other.name);
    }

    // hashCode
    @Override
    public int hashCode() {
        return java.util.Objects.hash(name, age);
    }

    // toString
    @Override
    public String toString() {
        return "Person[name=" + name + ", age=" + age + "]";
    }
}
</pre>



<h3 class="wp-block-heading"><span id="toc7">不変オブジェクトとしての設計</span></h3>



<p>レコードは通常のクラスとは異なり、<strong><span class="marker-under">フィールドが暗黙的に<code>final</code></span></strong> として扱われます。つまり、オブジェクトを生成した時点でフィールドは確定し、あとから値を変更できません。<br>これにより、<strong>「値が変わらない」という前提で設計する</strong>ことが容易になり、マルチスレッド環境などでの安全性も高まります。</p>



<h3 class="wp-block-heading"><span id="toc8">「意図」が明確化される</span></h3>



<p>普通のクラスは、何でもできてしまう柔軟性を持ちます。そのため、「このクラスは本来ただのデータを入れるだけのはずなのに、いつの間にかロジックが増えすぎている…」といった事態が起こりがちです。<br>一方、レコードは<strong>明示的に「データ保持用」であることを表す</strong>ものなので、実装する人にも使う人にも、その意図がわかりやすく伝わります。</p>



<h2 class="wp-block-heading"><span id="toc9">レコードを使う際の注意点</span></h2>



<h3 class="wp-block-heading"><span id="toc10">イミュータブルであること</span></h3>



<p>レコードは不変オブジェクトとして扱われることを想定しているため、<strong>基本的にはフィールドは再代入できない</strong>ようになっています。<br>ただし、フィールドが参照型で、内部に可変状態を持っている場合（例：<code>List</code> や <code>Map</code> など）には注意が必要です。レコード自身が保持する参照先のオブジェクトを通じて、内部データを変更できてしまう可能性があります。<br><strong>深い意味での完全な不変性</strong>を担保したい場合は、フィールドに不変コレクションを設定したり、コンストラクタ内で防御的コピーを行ったりする工夫が必要です。</p>



<h3 class="wp-block-heading"><span id="toc11">継承はできない</span></h3>



<p>レコードは暗黙的に <code>final</code> 扱いとなり、<strong>サブクラスとして継承することはできません</strong>。<br>Javaのオブジェクト指向の文脈では「<strong>継承</strong>がクラス設計の基本手段」という面もありますが、レコードは「あくまでデータの容れ物である」という思想により、クラス継承は不要だろうという考えに基づいています。<br>もし、継承による多態性が必要なら、レコードよりも<strong>通常のクラス</strong>を使うことが多いでしょう。</p>



<h3 class="wp-block-heading"><span id="toc12">参照型フィールドの取り扱い</span></h3>



<p>先ほど少し触れましたが、<strong>レコードのイミュータブル性は「フィールドへの再代入ができない」</strong>という点を保証するだけで、オブジェクト内部までは制御していません。</p>



<ul class="wp-block-list is-style-icon-list-check-valid has-list-style">
<li>例えば、<span class="blue"><code>public record MyData(List&lt;String&gt; list)</code> </span>と書いた場合、<code>list</code> 自体は後から他のオブジェクトに差し替えられませんが、<code>list</code> の内容を変更する（<code><span class="blue">list.add("someValue")</span></code>など）は可能です。</li>



<li>これを防ぎたいなら、<code>Collections.unmodifiableList(...)</code> を用いるなど、工夫が必要です。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc13">コンストラクタ周りの詳細</span></h2>



<p>レコードでは<strong>「すべてのフィールドを引数に取るコンストラクタ」</strong>（<span class="badge">参考</span> <a href="https://it-biz.online/java/java-constructor/">コンストラクタとは？</a>）が自動的に定義されます。先ほどの <code>Person</code> であれば <code><span class="blue">new Person(String name, int age)</span></code> というコンストラクタがすでに用意されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public final class Person extends java.lang.Record {
    private final String name;
    private final int age;

    // コンストラクタ
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
</pre>



<p>ただし、このコンストラクタに関しては、覚えておきたい必須知識がいくつかありますので、ここで解説しておきます。</p>



<h3 class="wp-block-heading"><span id="toc14">カノニカルコンストラクタ</span></h3>



<p>括弧内に宣言したフィールドの組み合わせと同じシグニチャのコンストラクタを「<strong>カノニカルコンストラクタ</strong>」と呼びます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record Person(String name, int age) {
    public Person(String name, int age) {
        // ここに処理を書いてもOK（必ず this.name = name; などの代入をしなければならない）
        this.name = name;
        this.age = age;
    }
}
</pre>



<p>先ほども解説した通り、カノニカルコンストラクタはレコードクラスを定義すると自動的に生成されますが、これを<strong>あえて自分で定義することも可能です。</strong>自分で定義するときは、<strong>レコードが自動生成するコードを「上書き」する</strong>イメージで記述していけばOKで、自分でバリデーションや初期化処理を細かく書きたいときに使います。</p>



<p>ただし、注意しなければいけないのが、カノニカルコンストラクタを利用するときは、<strong><span class="marker-under">必ずカノニカルコンストラクタ内ですべてのフィールドを初期化する必要がある！</span></strong>という点です。レコード特有の制限になるので頭に入れておきましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record Book(String title, int price) {

    // カノニカルコンストラクタを明示的に定義
    public Book(String title, int price) {
        // 追加ロジック（例：タイトルが空文字ならエラー）
        if (title == null || title.isBlank()) {
            throw new IllegalArgumentException("タイトルは必須です");
        }
        if (price &lt; 0) {
            throw new IllegalArgumentException("価格は0以上である必要があります");
        }

        // 必須：レコードのすべてのフィールドを初期化
        this.title = title;
        this.price = price;
    }
}
</pre>



<p>上記のように<strong>全コンポーネントをパラメータとして受け取り、その値で必ずフィールドを初期化</strong>する必要があります。</p>



<h3 class="wp-block-heading"><span id="toc15">コンパクトコンストラクタ</span></h3>



<p>レコードには、さらに便利な「<strong>コンパクトコンストラクタ</strong>」という書き方があります。<strong><strong><br>これは</strong>シグニチャがカノニカルコンストラクタと同一</strong>（= 全フィールドを引数に取る）である点は変わりませんが、<strong>メソッドシグニチャを省略</strong>して書ける構文です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record Book(String title, int price) {

    // コンパクトコンストラクタ（シグニチャ省略）
    public Book {
        if (title == null || title.isBlank()) {
            throw new IllegalArgumentException("タイトルは必須です");
        }
        if (price &lt; 0) {
            throw new IllegalArgumentException("価格は0以上である必要があります");
        }
        // title, price への代入は暗黙的に行われる
        // → this.title = title; this.price = price; 
    }
}
</pre>



<p>コンパクトコンストラクタでは、<strong>括弧内に引数を再度書かなくていい</strong>（すでにレコードで宣言してあるから）という簡略化がなされています。ここで書かれた処理は、最終的にレコードのフィールドを初期化する「カノニカルコンストラクタ」に統合されるイメージです。データに対するバリデーションや前処理を入れる場合、コンパクトコンストラクタが非常に便利です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>カノニカルコンストラクタ</strong>
<ul class="wp-block-list">
<li>レコードのコンポーネントをすべて引数に取り、すべてのフィールドを初期化するコンストラクタ。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">これを<strong>自動生成</strong>するだけでなく、<strong>明示的に定義してカスタマイズ</strong>もできる。</li>
</ul>
</li>



<li><strong>コンパクトコンストラクタ</strong>
<ul class="wp-block-list">
<li>カノニカルコンストラクタを<strong>省略形</strong>で書く方法。</li>



<li>パラメータリストを省略しつつ、必要なバリデーション等を記述できる。</li>



<li>こちらも<strong>フィールドの初期化は必須</strong>だが、コンパイラが暗黙的に <code>this.xxx = xxx;</code> を行ってくれる。</li>
</ul>
</li>
</ol>
</div>



<h2 class="wp-block-heading"><span id="toc16">レコードの活用例</span></h2>



<h3 class="wp-block-heading"><span id="toc17">DTO（データ転送オブジェクト）としての利用</span></h3>



<p>最も典型的な利用方法のひとつが、<strong>DTO（Data Transfer Object）としての利用</strong>です。<br>アプリケーション内で複数の値をまとめて別のメソッドやモジュールへ引き渡すとき、単にフィールドを持つためだけのクラスを作ることがあります。そこにレコードが大変便利です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 例: 顧客情報DTO
public record CustomerDto(String name, String email, String address) {
}
</pre>



<p>こうしておけば、わざわざgetterやequals()などを書かずに済みますし、「ああ、これはただのデータ入れ物なんだな」という意図を明示できます。</p>



<h3 class="wp-block-heading"><span id="toc18">Web APIレスポンスの格納</span></h3>



<p>サーバーサイドJavaやクライアント側でWeb APIをコールして、その結果返ってきたJSONやXMLなどを<strong>オブジェクトとして受け取る</strong>機会はよくあります。<br>このとき、少し前までは<strong>POJO</strong>（Plain Old Java Object）や<strong>Lombok</strong>で生成したクラスを使うことが主流でしたが、Java 16以降なら気軽にレコードを使えます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record UserResponse(String username, int age, String city) {
}
</pre>



<p>JacksonやGsonといったライブラリも、（バージョンや設定によりますが）レコードをある程度認識して扱えるようになっています。シリアライゼーションやデシリアライゼーションの際に、コンストラクタ引数を使う形で解釈してくれます。</p>



<h3 class="wp-block-heading"><span id="toc19">小規模な値オブジェクトの表現</span></h3>



<p>ドメイン駆動設計(DDD)の文脈などで、<strong>値オブジェクト</strong>という単位が存在します。これらは通常、同値性を判定するための <code>equals()</code> と <code>hashCode()</code> が欠かせません。さらに、値オブジェクトはイミュータブルであることが推奨されます。<br>レコードで定義すれば、その2点（同値性メソッドとイミュータブル設計）を<strong>あまり意識せずに自動で満たせる</strong>ため、値オブジェクトを気軽に作成できます。</p>



<h2 class="wp-block-heading"><span id="toc20">レコードの制限事項・よくある疑問</span></h2>



<h3 class="wp-block-heading"><span id="toc21">サブクラスは作れない？</span></h3>



<p>先ほども触れましたが、レコードは暗黙に <code>final</code> なクラスとして扱われるため、<strong>継承によるサブクラス化は不可能</strong>です。<br>もしどうしても似たようなレコード同士を<strong>共通インターフェース</strong>でまとめたいなら、<strong>インターフェース</strong>（あるいはsealed interface）を実装する形をとることは可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public sealed interface Animal permits Cat, Dog {
    String name();
}

public record Cat(String name) implements Animal {}
public record Dog(String name) implements Animal {}
</pre>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/java/java-interface/" title="Java：インターフェースとは？わかりやすく３分で解説(interface/implements)" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/05/image-19-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/05/image-19-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/05/image-19-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/05/image-19-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Java：インターフェースとは？わかりやすく３分で解説(interface/implements)</div><div class="blogcard-snippet internal-blogcard-snippet">【超・初心者向け】Javaのインターフェースとは？その基本概念と利用する理由、そして拡張性の高さについて、具体的なサンプルコードと日常生活の例を交えてわかりやすく解説します。インターフェースを使った柔軟で拡張性の高いプログラム設計を学びましょう。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2025.04.13</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc22">equals(), hashCode(), toString()のカスタマイズはどうなる？</span></h3>



<p>レコードでは、フィールドに基づいた <code>equals()</code> や <code>hashCode()</code>、<code>toString()</code> が自動生成されます。<br>しかし、どうしてもカスタマイズしたいケースがあるかもしれません。その場合、<strong>通常のクラスと同じように自分でメソッドをオーバーライド</strong>できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public record Person(String name, int age) {
    @Override
    public String toString() {
        return "名前=" + name + ", 年齢=" + age;
    }
}
</pre>



<p>ただし、「レコードは純粋に値を表現する」ことが目的ですから、むやみにメソッドを上書きするのは設計上あまり好ましくない場合もあります。必要性をよく検討したうえで行うのがよいでしょう。</p>



<h3 class="wp-block-heading"><span id="toc23">レコードの可変フィールドは？</span></h3>



<p>レコードのフィールドは暗黙的に <code>private final</code> となるため、<strong>可変（<code>var</code>）なフィールドは基本的に定義できません</strong>。そのため、「後から値を変えたい」ケースや「大きなオブジェクトを段階的に組み立てたい」ケースにはレコードは不向きです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>どうしても可変が必要なら、<strong>通常のクラス</strong>を使うか、あるいは<strong>ビルダー</strong>パターンを検討するほうが適切な場合が多いです。</p>
</div></div>



<p>レコードは「<strong>単にデータを表すだけの軽量クラス</strong>」をとてもシンプルに表現できる仕組みです。Lombokのように外部ライブラリに頼らなくても、Java言語標準だけでボイラープレートを削減できる点は大きなメリットといえます。</p>



<p>また、レコードは<strong>イミュータブルな値オブジェクト</strong>の表現とも非常に相性が良いため、DDD（ドメイン駆動設計）の文脈や並行処理の多いアプリケーションでも有効です。ただし、<strong>継承ができない</strong>という仕様や<strong>可変データ構造を扱うときの注意</strong>など、いくつかの制限はあるので、何でもかんでもレコードにすればいいわけではありません。</p>



<p>ぜひ、Javaのバージョンが16以上を使える環境であれば、従来のJavaクラスで煩雑だった部分をレコードに置き換えてみて、そのシンプルさと読みやすさを実感してみてください。適切に使い分けることで、<strong>ソースコードが洗練され、メンテナンスがしやすくなる</strong>はずです。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Java】instanceof演算子：パターンマッチング機能を1分でわかりやすく</title>
		<link>https://it-biz.online/java/pattern-matching-for-instanceof/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 12:00:00 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9998</guid>

					<description><![CDATA[Java 16で正式に導入された、instanceof演算子のパターンマッチング機能（Pattern Matching for instanceof）は、型チェックとキャストを一括で処理できる構文です。コードをよりシンプ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Java 16で正式に導入された、<a href="https://it-biz.online/java/java-instanceof/"><code>instanceof</code>演算子</a>の<strong>パターンマッチング機能（Pattern Matching for instanceof）</strong>は、<strong><span class="marker-under">型チェックとキャストを一括で処理できる構文</span></strong>です。コードをよりシンプルかつ安全に書くための機能ですが、仕組みや使い方に戸惑う方も多いかもしれません。</p>



<p>特にJava Silver試験などでよく問われる内容でもあり、今後徐々に利用頻度が増えていくと思われる重要構文の１つです。現場で活躍できるJavaプログラマーを目指す方であれば知っておきたい基本知識の１つです。</p>



<p>このページではパターンマッチング機能について１からわかりやすく解説します。是非最後までご覧ください。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">【前提】instanceofでの判定とキャスト</a></li><li><a href="#toc2" tabindex="0">パターンマッチング付きinstanceofの基本構文</a><ol><li><a href="#toc3" tabindex="0">パターンマッチング機能のメリット</a></li></ol></li><li><a href="#toc4" tabindex="0">パターン変数のスコープと使い方</a><ol><li><a href="#toc5" tabindex="0">&#x1f50d; パターン変数のスコープは「判定が真のブロック内のみ」</a></li></ol></li><li><a href="#toc6" tabindex="0">論理演算子（AND/ORなど）と組み合わせる場合</a></li><li><a href="#toc7" tabindex="0">なぜ「パターンマッチング」と呼ばれるのか</a></li><li><a href="#toc8" tabindex="0">if-else if-else構文との併用</a></li><li><a href="#toc9" tabindex="0">ネストした条件分岐</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">【前提】instanceofでの判定とキャスト</span></h2>



<p>Java 15以前では、あるオブジェクトが特定の型かを判定し、それを利用しようとする場合、次のように「判定 → キャスト」の2段階を踏むのが一般的でした。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = "Hello World"; // ここでは実際は String 型

if (obj instanceof String) {
    // まず instanceof で判定
    String s = (String) obj; // キャストを明示的に書く
    System.out.println(s.toUpperCase());
}
</pre>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin"><code><span class="blue">if (obj instanceof String)</span></code> で型チェック (<code>String</code>型かどうか)</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><span class="blue"><code>String s = (String) obj;</code> </span>でキャスト</li>



<li><code><span class="blue">s.toUpperCase()</span></code> のようにメソッド呼び出し</li>
</ol>



<p>このように、判定とキャストがそれぞれ別々の箇所に存在し、<strong>キャストが常に明示的に必要</strong>という点がやや煩わしいところでした。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/java/type-cast/">キャストとは？</a></p>



<h2 class="wp-block-heading"><span id="toc2">パターンマッチング付きinstanceofの基本構文</span></h2>



<p>Java 16以降では、上記処理をより簡潔に記述できるようになりました。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = "Hello World";

if (obj instanceof String s) {
    // 'instanceof String s' で判定とキャストを同時に行う
    System.out.println(s.toUpperCase());
}
</pre>



<p>この書き方では、</p>



<ul class="wp-block-list is-style-icon-list-circle has-list-style">
<li><code><span class="blue">obj instanceof <span class="bold-green">String s</span></span></code> が「パターン」にあたります。
<ul class="wp-block-list">
<li><code>String s</code> と書くことで、<strong><span class="marker-under"><code>obj</code>が<code>String</code>型の場合に、自動的にその型で扱うための変数 <code>s</code> を用意</span></strong>してくれます。</li>



<li>実際には<code>(String)obj</code>をする必要がなくなり、<strong>冗長なキャストが省略</strong>できます。</li>
</ul>
</li>



<li><code>obj</code>が<code>String</code>型でない場合は<code>if</code>文の条件が<code>false</code>となるので、ブロック内部は実行されません。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc3">パターンマッチング機能のメリット</span></h3>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>コードがスッキリ</strong>
<ul class="wp-block-list">
<li>従来のように毎回キャストを書く必要がなくなり、可読性が向上します。</li>
</ul>
</li>



<li><strong>スコープの明確化</strong>
<ul class="wp-block-list">
<li><code>s</code>という変数は<strong><code>if</code>ブロック内のみ有効</strong>になるため、意図しない範囲で使われる可能性がありません。</li>
</ul>
</li>



<li><strong>安全性の向上</strong>
<ul class="wp-block-list">
<li><code>instanceof</code>の結果が<code>true</code>だった場合だけパターン変数が使えるので、<code>ClassCastException</code>のリスクを意識しなくて済みます。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc4">パターン変数のスコープと使い方</span></h2>



<p>パターンマッチングを行った変数（上の例だと <code>s</code>）の<strong>有効範囲（スコープ）は、<code>instanceof</code>のチェックが行われたブロック内</strong>に限られます。↓のコードを見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = "Hello World";

if (obj instanceof String s) {
    // ここでは s は String 型として使える
    System.out.println("Upper case: " + s.toUpperCase());
} else {
    // ここでは s は使えない
    // System.out.println(s.toLowerCase()); // コンパイルエラーになる
}
</pre>



<ul class="wp-block-list">
<li><code>if</code>ブロック内では、変数<code>s</code>は<code>String</code>型として使用できます。</li>



<li><code>else</code>ブロックや<code>if</code>ブロックを抜けた後では、<code>s</code>は「存在しない」扱いなので使用できません。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これは一見不便に思えるかもしれませんが、「その型だと判明している場所だけでしか使わない」という意図が明確になるため、可読性と安全性が高まります。</p>
</div></div>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<h3 class="wp-block-heading"><span id="toc5">&#x1f50d; パターン変数のスコープは「判定が真のブロック内のみ」</span></h3>



<p><code>instanceof</code> のパターン変数（例：<code>String s</code>）は、<strong>判定が true になったときにのみ有効</strong>になります。<br>つまり、<code>if (obj instanceof String s)</code> の場合は <code>if</code> の中、<br><code>if (<span class="bold-red">!</span>(obj instanceof String s))</code> の場合は <strong><code>else</code> の中</strong> で <code>s</code> が有効になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">public class InstanceofScopeExample {
    public static void main(String[] args) {
        Object obj = "Hello World";

        // パターン①: instanceof が true になる場合
        if (obj instanceof String s) {
            System.out.println("[1] 大文字: " + s.toUpperCase()); // → OK: "HELLO WORLD"
        } else {
            // s はこのスコープでは未定義なので使えない
            // System.out.println(s.toString()); // &#x274c; コンパイルエラー
        }

        // パターン②: 否定して else にスコープが移る場合
        if (!(obj instanceof String s)) {
            System.out.println("[2] Object: " + obj.toString()); // → s は未定義なので使えない
            // System.out.println(s.toString()); // &#x274c; コンパイルエラー
        } else {
            // s はここで有効（判定が true であることが確定）
            System.out.println("[2] 小文字: " + s.toLowerCase()); // → OK: "hello world"
        }
    }
}
</pre>



<p class="has-text-align-center"><strong>&#x1f4ac; 補足ワンポイント</strong></p>



<p><strong><code>instanceof</code> パターンマッチングの変数 <code>s</code> は、条件が true になった瞬間に利用可能になる</strong>、というイメージでOKです。<br>もっと正確に言えば：</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><code>instanceof 型名 変数名</code> が true と判断された<strong>スコープ内（then または else）で、変数が自動的に定義された状態になる</strong>。</p>
</blockquote>
</div>



<h2 class="wp-block-heading"><span id="toc6">論理演算子（AND/ORなど）と組み合わせる場合</span></h2>



<p>Java 16で導入されたパターンマッチングは「<a href="https://it-biz.online/java/java-operator/">論理演算子</a>」と組み合わせて書く場合が特に強力です。よくある例として、<code>&amp;&amp;</code>（AND）を使って<strong>条件が<code>true</code>になった場合のみ追加チェックをしたい</strong>ケースがあります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = "Hello World";

if (obj instanceof String s &amp;&amp; !s.isEmpty()) {
    // obj が String にマッチし、かつ s が空文字列ではない場合
    System.out.println("Lower case: " + s.toLowerCase());
}
</pre>



<ul class="wp-block-list">
<li><code>obj instanceof String s</code> が<code>true</code>のときだけ変数 <code>s</code> が<code>String</code>型として扱える</li>



<li>その結果をさらに使って <code>!s.isEmpty()</code> をチェック</li>
</ul>



<p>ここでのポイントは、<strong><code>instanceof</code>が<code>true</code>でないと<code>&amp;&amp;</code>の右側は評価されない（短絡評価）</strong>ため、<code>s</code>を安全に使うことができます。（左側が<code>false</code>の場合は右側にたどり着かないので、そもそも<code>String</code>としての操作が行われず、<code>ClassCastException</code>などの心配もありません。）</p>



<h2 class="wp-block-heading"><span id="toc7">なぜ「パターンマッチング」と呼ばれるのか</span></h2>



<p>「パターンマッチング」という用語は、たとえばScalaやKotlinなどでは<code>match</code>式や<code>when</code>式として、型や値のパターンをマッチさせて分岐処理を簡潔に記述できる機能を指します。Javaの<code>instanceof</code>への拡張は「パターンマッチングを導入する」流れの一部で、将来的には<code>switch</code>文などでもパターンマッチングを活用できる機能が拡充されています（Java 17以降でプレビュー機能として提供）。</p>



<p><code>instanceof String s</code> は、</p>



<ul class="wp-block-list">
<li>「もし <code>obj</code> が <code>String</code>型というパターンにマッチしたならば」</li>



<li>「そのマッチ対象を <code>s</code> という変数として使えるようにする」</li>
</ul>



<p>という発想で書かれています。これが「パターンマッチング」と呼ばれる理由です</p>



<h2 class="wp-block-heading"><span id="toc8">if-else if-else構文との併用</span></h2>



<p>複数の型の可能性をチェックするケースも、よりスマートに書けます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = Integer.valueOf(100);

if (obj instanceof String s) {
    System.out.println("It's a String: " + s.toUpperCase());
} else if (obj instanceof Integer i) {
    System.out.println("It's an Integer: " + (i + 10));
} else {
    System.out.println("Unknown type.");
}

// It's an Integer: 110
</pre>



<p><code>obj</code>がそれぞれどの型にマッチしたかで場合分けできますし、マッチしたブロック内では常に該当の型として安全に操作できます。</p>



<h2 class="wp-block-heading"><span id="toc9">ネストした条件分岐</span></h2>



<p>パターン変数が使えるのは、その<code>if</code>文や、論理演算子でつながった同一の評価式内になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object obj = "Nested Checking";

if (obj instanceof String s) {
    if (s.length() > 5) {
        System.out.println("String is more than 5 characters");
    }
}

// String is more than 5 characters
</pre>



<p>このようにネストしていくことも可能ですが、論理演算子（<code>&amp;&amp;</code>や<code>||</code>）を使ってまとめて書く方法も便利です。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>instanceof演算子のパターンマッチング機能</strong></p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li><strong>従来の方法（Java 15以前）</strong>
<ul class="wp-block-list">
<li><code>instanceof</code>で型をチェック → 明示的にキャスト → キャストした変数で操作</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">コードがやや冗長で、スコープが広くなる場合もある。</li>
</ul>
</li>



<li><strong>新しいパターンマッチング（Java 16以降）</strong>
<ul class="wp-block-list">
<li><code>if (obj instanceof String s)</code> という書き方で、型チェックとキャストを一括処理</li>



<li>余計なキャストが不要で、読みやすくなる。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin">変数 <code>s</code> のスコープが<code>if</code>ブロックの中だけに限定され、安全性と可読性が向上。</li>
</ul>
</li>



<li><strong>スコープ &amp; 論理演算子</strong>
<ul class="wp-block-list">
<li>パターン変数 <code>s</code> は、判定したブロックや論理演算子で接続されている範囲内だけ有効。</li>



<li class="is-style-bottom-margin-2em has-bottom-margin"><code>&amp;&amp;</code> や <code>||</code> と組み合わせると、追加の条件式ともスムーズに組み合わせて書ける。</li>
</ul>
</li>



<li><strong>今後の拡張</strong>
<ul class="wp-block-list">
<li>Java 17以降では<code>switch</code>文など、さらに複雑な「パターンマッチング」が徐々に導入（プレビュー）されている。</li>



<li>Java言語全体として、他のモダン言語のように「マッチした型や条件に応じた分岐処理を簡潔に書ける」方向へ進化している。</li>
</ul>
</li>
</ol>
</div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Java 16以降を使える環境であれば、このパターンマッチングを活用してみることをおすすめします。条件分岐やキャスト周りのコードが大幅にシンプルになり、可読性と保守性が向上するはずです。ぜひ活用してみてください！</p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
