Java

スポンサーリンク
Java

Java | オブジェクト指向:神クラス(God Object)

神クラス(God Object)とは何か神クラス(God Object)は「システムのあらゆることを“何でも知っていて、何でもやろうとする”巨大なクラス」のことです。画面の制御もやる。ビジネスロジック...
Java

Java | オブジェクト指向:クラス肥大化の兆候

クラス肥大化って何がまずいのかクラス肥大化は「とりあえずあれこれ押し込んでいるうちに、そのクラスだけ異様に太ってしまった状態」です。1つのクラスが、画面の制御も、ビジネスロジックも、DB のやりとりも...
Java

Java | オブジェクト指向:不変条件の守り方

不変条件ってそもそも何なのか不変条件(invariant)は「このオブジェクトが“生きている間ずっと”守られていないといけない約束」のことです。例えると、ユーザーのポイントは常に 0 以上注文は明細を...
Java

Java | オブジェクト指向:不正な setter の問題

なぜ「不正な setter」が問題になるのかsetter 自体は悪ではありません。ただ「何でもかんでも public な setter を生やす」「ルールも何もなく値を変えられるようにする」と、オブジ...
Java

Java | オブジェクト指向:リッチドメインモデル

リッチドメインモデルとは何かリッチドメインモデルは「ドメイン(業務)の知識とルールを、“それっぽい名前だけの入れ物”ではなく、クラスの中身としてちゃんと持たせよう」という考え方です。もっとストレートに...
Java

Java | オブジェクト指向:貧血モデルとは

貧血モデルとは何か貧血モデル(Anemic Domain Model)は「フィールド(データ)だけ持っていて、自分の振る舞い(ビジネスロジック)をほとんど持たないオブジェクト」がシステム中にあふれてい...
Java

Java | オブジェクト指向:ドメインモデルの考え方

ドメインモデルとは何かドメインモデルは「扱っている世界(業務)の“概念”を、そのままクラスとして表現したもの」です。給料計算システムなら「社員」「勤怠」「給与」EC サイトなら「商品」「カート」「注文...
Java

Java | オブジェクト指向:switch 文のオブジェクト化

「switch 文のオブジェクト化」とは何か「switch 文のオブジェクト化」は、switch にベタっと書いている「種類ごとの違い」を、それぞれのクラス(オブジェクト)に持たせるように書き換えるこ...
Java

Java | オブジェクト指向:if 文だらけのコードの問題点

if 文だらけのコードが「なぜツラくなる」のかif 自体は悪ではありません。条件分岐はどの言語にもある基本機能だし、使う場面ももちろんあります。問題になるのは、「if 文がコードのあちこちに増えすぎて...
Java

Java | オブジェクト指向:ポリモーフィズムによる分岐削減

ポリモーフィズムで分岐を減らすとは何か「ポリモーフィズムによる分岐削減」は、if や switch でゴチャゴチャ分岐している処理を、「オブジェクトの“型ごとの振る舞いの違い”に任せてスッキリさせる」...
Java

Java | オブジェクト指向:ファクトリメソッドの概念

ファクトリメソッドとは何かファクトリメソッドは「new の代わりに“生成専用メソッド”を用意して、オブジェクトの作り方をそこに閉じ込める考え方」です。普通は new で直接コンストラクタを呼んでオブジ...
Java

Java | オブジェクト指向:セッターインジェクション

セッターインジェクションとは何かセッターインジェクションは「必要な相手(依存オブジェクト)を、コンストラクタではなく setter メソッドで後から差し込む」という DI(依存性注入)のやり方です。コ...
Java

Java | オブジェクト指向:コンストラクタインジェクション

コンストラクタインジェクションとはコンストラクタインジェクションは「そのクラスが必要とするオブジェクト(依存)を、コンストラクタの引数で受け取る」という設計のやり方です。もっと噛み砕くと、・自分の中で...
Java

Java | オブジェクト指向:DI(依存性注入)の考え方

DI(依存性注入)とは何かDI(Dependency Injection)は「必要な相手(依存先)を、自分で new しないで“外から渡してもらう”考え方」です。もっと噛み砕くと、本来一緒に仕事をする...
Java

Java | オブジェクト指向:インターフェース分離

インターフェース分離とは何かインターフェース分離(Interface Segregation Principle, ISP)は、「インターフェースは、小さくて、はっきりした役割ごとに分けなさい」という...
Java

Java | オブジェクト指向:クラス間の依存を減らす方法

なぜ「クラス間の依存を減らす」のが大事なのかクラス同士がベッタリ依存していると、どこか 1 クラスを少し変えただけで、他のクラスが次々壊れていきます。「このメソッド名を変えたいだけなのに、10 クラス...
Java

Java | オブジェクト指向:パッケージ図

パッケージ図とは何かパッケージ図は「大きな箱同士の関係」を描く図です。クラス図が「クラスとクラスの関係の地図」だとすると、パッケージ図は「パッケージとパッケージの関係の地図」です。Java の com...
Java

Java | オブジェクト指向:UML の読み方

UML とは何か(まず全体像)UML は「図でプログラムを表すための共通ルール」のようなものです。Java のコードを、箱や矢印で表現して「このシステムにはどんなモノがいて、どうつながっているか」を見...
Java

Java | オブジェクト指向:クラス図の基礎

クラス図とは何かクラス図は「オブジェクト指向の設計図」です。クラス(型)の名前、持っているデータ(フィールド)、できること(メソッド)、そしてクラス同士の関係(関連・継承・依存など)を「箱と線」で表し...
Java

Java | オブジェクト指向:関連の多重度

関連の多重度とは何か「関連の多重度」は、「あるクラスと別のクラスが、どれくらいの数で結びついているか」を表す考え方です。UML だと 1, 0..1, *, 0..*, 1..* みたいな表記を見たこ...
Java

Java | オブジェクト指向:集約と関連

集約と関連とは何かオブジェクト指向で「集約」と「関連」は、クラスとクラスの“つながり方”を表す言葉です。ざっくり言うと、関連:ただの「知り合い」関係(A が B を知っている・参照している)集約:ある...
Java

Java | オブジェクト指向:オブジェクトのライフサイクル

オブジェクトのライフサイクルとは「オブジェクトのライフサイクル」は、あるオブジェクトが生まれて(生成されて)、使われて、やがて不要になり、最後に片付けられるまでの一連の流れのことです。Java では、...
Java

Java | オブジェクト指向:単一責任の原則(SRP)

単一責任の原則(SRP)とは単一責任の原則(Single Responsibility Principle, SRP)は「クラスやモジュールは“たった1つの責任(変更理由)だけ”を持つべき」というルー...
Java

Java | オブジェクト指向:責務分離

責務分離とは責務分離は「ひとつのクラスやメソッドが、ひとつの明確な役割(Responsibility)だけを担うように分ける」設計の基本です。入力の整形、検証、計算、保存、表示などの関心事を混ぜず、境...
Java

Java | オブジェクト指向:パッケージ設計

パッケージ設計とはパッケージ設計は、クラスやインターフェースを「意味のあるまとまり」に分けて整理し、依存の向きと公開範囲をコントロールすることです。狙いは、変更の影響を局所化し、再利用とテストをしやす...
Java

Java | オブジェクト指向:継承 vs 委譲

継承と委譲の違い継承は「is-a(〜は〜の一種)」の関係で、親の振る舞いを子が受け継ぎ、必要ならオーバーライドで差分を加える仕組みです。委譲(コンポジション)は「has-a(〜は〜を持つ)」の関係で、...
Java

Java | オブジェクト指向:コンポジション(委譲)

コンポジション(委譲)とはコンポジションは「クラスが“持つ(has-a)”関係で他のオブジェクトを部品として組み合わせ、仕事をその部品へ任せる(委譲する)」設計です。継承(is-a)と違い、親の内部契...
Java

Java | オブジェクト指向:依存の方向

依存の方向とは「依存の方向」は、あるコードがどちら側(上位/下位、抽象/具体)へ向かって頼っているかを示す考え方です。呼び出し側が別のクラスやライブラリに依存するとき、その“向き”が正しいかどうかで保...
Java

Java | オブジェクト指向:依存関係とは

依存関係とは依存関係は「あるコードが、他のコードの存在や振る舞いを前提にして成り立っている状態」です。クラスが別のクラスを new したり、そのメソッドを呼んだり、型として参照したりすると、そこで依存...
Java

Java | オブジェクト指向:コンパイル時型と実行時型

コンパイル時型と実行時型とは「コンパイル時型」はコード上で宣言された“見える型”で、コンパイラが文法チェックやメソッド呼び出しの可否を判断するために使います。「実行時型」は new で実際に生成されて...
Java

Java | オブジェクト指向:動的バインディング

動的バインディングとは動的バインディングは「どのメソッド実装を呼ぶかを、実行時の“実体の型”に基づいて決める仕組み」です。参照の型が親(抽象クラスやインターフェース)でも、実際に入っているオブジェクト...
Java

Java | オブジェクト指向:instanceof

instanceof とは何かinstanceof は「ある参照が、特定の型(クラスやインターフェース)の実体かどうか」を真偽で判定する演算子です。ポリモーフィズムでは呼び出し側は共通型にそろえますが...
Java

Java | オブジェクト指向:ダウンキャスト

ダウンキャストとは何かダウンキャストは「親型(抽象クラスやインターフェース)の参照を、より具体的な子型に“下げて”扱う」ことです。たとえば Shape 型の変数を Rect 型として扱いたいときに使い...
Java

Java | オブジェクト指向:アップキャスト

アップキャストとは何かアップキャストは「子クラス(具体的な型)の参照を、親クラス(より抽象的な型)やインターフェースの参照として扱う」ことです。型を“上位”に持ち上げるイメージなのでアップ(up)キャ...
Java

Java | オブジェクト指向:ポリモーフィズム

ポリモーフィズムとはポリモーフィズムは「同じ“呼び方”で、実体に応じて振る舞いが切り替わる」仕組みです。呼び出し側は共通の型(親クラスやインターフェース)だけを意識して使い、実際に入っているオブジェク...
Java

Java | オブジェクト指向:static メソッド(interface)

interface の static メソッドとはインターフェースの static メソッドは「インターフェース名から直接呼ぶユーティリティ関数」です。インスタンスや実装クラスは不要で、契約(インター...
Java

Java | オブジェクト指向:default メソッド

default メソッドとはdefault メソッドは「インターフェースに書く“簡易の既定実装”」です。Java 8 で導入され、インターフェースにメソッド本体を持たせられるようになりました。これによ...
Java

Java | オブジェクト指向:インターフェースの多重実装

インターフェースの多重実装とはインターフェースの多重実装は「1つのクラスが複数のインターフェース契約を同時に満たす」ことです。Javaはクラスの多重継承はできませんが、インターフェースは複数まとめて ...
Java

Java | オブジェクト指向:implements

implements とは何かimplements は「クラスがインターフェースの契約を実装します」という宣言です。インターフェースが定めるメソッドの“名前・引数・戻り値”を、クラス側で実体として提供...
Java

Java | オブジェクト指向:インターフェースとは

インターフェースとはインターフェースは「クラスが満たすべき契約(メソッドの型だけ)を定義するもの」です。実装は持たず、まず“名前・引数・戻り値”を決めることで、呼び出し側は契約だけに依存できます。クラ...
Java

Java | オブジェクト指向:抽象クラスの使いどころ

抽象クラスの狙いどころ抽象クラスは「共通の骨格と不変条件を親で固定し、差し替えたい部分だけ子に実装させる」ための道具です。インターフェースが“契約(メソッドの型)”だけなのに対し、抽象クラスは“状態(...
Java

Java | オブジェクト指向:抽象メソッド

抽象メソッドとは抽象メソッドは「中身(実装)がないメソッド」で、宣言だけを持ちます。abstract を付けて宣言し、具体的な処理は子クラスが必ず実装します。抽象クラスに定義して、共通の“名前・引数・...
Java

Java | オブジェクト指向:抽象クラスとは

抽象クラスとは抽象クラスは「直接はインスタンス化できない、共通の骨格と契約をまとめるためのクラス」です。abstract を付けて宣言し、抽象メソッド(中身のないメソッド)を含められます。継承した子ク...
Java

Java | オブジェクト指向:final フィールド

final フィールドとは何かfinal フィールドは「一度だけ代入でき、その後は再代入できない」フィールドです。オブジェクトの生成時に値を確定し、以降は参照を変えないことで、設計の予測可能性が上がり...
Java

Java | オブジェクト指向:final メソッド

final メソッドとは何かfinal メソッドは「子クラスからオーバーライド(上書き)できないメソッド」です。継承関係にあっても、その振る舞いを固定し、契約を壊されないようにします。親が守るべき安全...
Java

Java | オブジェクト指向:final クラス

final クラスとは何かfinal クラスは「継承を禁止したクラス」です。extends して子クラスを作ることができません。目的は、クラスの振る舞いを固定して“改変の余地”をなくし、設計の安全性・...
Java

Java | オブジェクト指向:多段継承の概念

多段継承とは何か多段継承は「親→子→孫…と継承が階層的に連なっている状態」を指します。AをBが継承し、BをCが継承する、といった“何段も連なる継承”です。Javaは「単一継承」なのでクラスを複数同時に...
Java

Java | オブジェクト指向:親クラスのコンストラクタ呼び出し

親コンストラクタ呼び出しとは何か子クラスのコンストラクタが、親クラス(スーパークラス)のコンストラクタを呼び出して「親の状態を先に正しく初期化する」仕組みです。Java では super(...) を...
Java

Java | オブジェクト指向:super キーワード

何をするキーワードかsuper は「親クラス(スーパークラス)のメンバーを参照する」ためのキーワードです。子クラスでオーバーライドしたメソッドから、親の元の実装を呼びたいときや、親のコンストラクタを明...
Java

Java | オブジェクト指向:継承のデメリット

まず、継承のデメリットとは何か継承は便利ですが、「親と子が強く結び付く」ため、変更や保守の難易度を上げる要因になりがちです。意図しない依存が広がり、拡張やテストが難しくなる“落とし穴”が複数あります。...
Java

Java | オブジェクト指向:継承のメリット

継承のメリットを一言で継承の最大のメリットは「共通の契約を共有しながら、振る舞いだけを差し替えて再利用できる」ことです。コードの重複を減らし、拡張しやすく、呼び出し側は共通型で扱えるため、全体の設計が...
Java

Java | オブジェクト指向:継承(extends)

まず、継承(extends)とは何か継承は「既存のクラスの性質(フィールドやメソッド)を受け継ぎ、必要な部分だけを差し替えたり足したりする」仕組みです。extends で親クラスを指定すると、子クラス...
Java

Java | オブジェクト指向:@Override アノテーション

何をするアノテーションか@Override は「このメソッドは親のメソッドをオーバーライド(上書き)しています」とコンパイラに伝えるための印です。付けておくと、シグネチャの食い違いやタイプミス、オーバ...
Java

Java | オブジェクト指向:メソッドのオーバーライド

何が「オーバーライド」かメソッドのオーバーライドは、親クラスが持つメソッドの「振る舞いを、子クラスで置き換える」ことです。継承関係にあるとき、同じメソッド名・同じ引数(シグネチャ)を子クラスで再定義す...
Java

Java | オブジェクト指向:toString のオーバーライド

toString をオーバーライドする意味toString は「そのオブジェクトを人間が読める文字列にする」ためのメソッドです。デフォルトはクラス名+ハッシュ(例: com.example.User@...
Java

Java | オブジェクト指向:equals と == の違い

ざっくり結論== は「同じ実体(同じ場所)か」を比べる演算子、equals は「中身(値)が同じか」を比べるメソッドです。プリミティブでは == が値比較、参照型(オブジェクト)では == が参照比較...
Java

Java | オブジェクト指向:hashCode のオーバーライド

なぜ hashCode をオーバーライドするのかhashCode は「オブジェクトのハッシュ値」を返すメソッドで、HashMap・HashSet などのハッシュ構造が「どのバケットに入れるか」を決める...
Java

Java | オブジェクト指向:equals のオーバーライド

equals をオーバーライドする意味equals は「同じモノかどうか」を値の観点で判定するためのメソッドです。デフォルトの equals は「同じインスタンス(同一性)」しか比較しませんが、値オブ...
Java

Java | オブジェクト指向:値オブジェクトとは

値オブジェクトとは何か値オブジェクトは「値そのものを表す小さな不変の型」です。金額、メールアドレス、期間、座標、IDなど、意味とルールを持つ“ただの値”をクラス化して、検証・整合性・振る舞い(比較や計...
Java

Java | オブジェクト指向:不変オブジェクトの考え方

不変オブジェクトとは何か不変オブジェクトは「生成後に状態が一切変わらない」オブジェクトです。フィールドは初期化時に確定され、その後は再代入されません。外から見ても中から見ても、値が変化しないので、並行...
スポンサーリンク