Javaの「final」「finally」「finalize」の違いをわかりやすく解説
Javaには名前に「final」が含まれる3つの要素、「final」「finally」「finalize」があります。それぞれ名前は似ていますが、役割も分類もまったく異なります。この記事では、それぞれの特徴と使い方をコード例付きで詳しく解説します。
final(キーワード)
「final」はキーワードであり、クラス・メソッド・変数に対して制限をかけるために使用されます。
- クラスに付けた場合:そのクラスは継承できません(例:Stringクラスなど)。
- メソッドに付けた場合:サブクラスでオーバーライドできません。
- 変数に付けた場合:定数として扱われ、一度代入すると値を変更できません。
final変数は宣言時に初期化する必要があり、値を再代入したり再初期化したりすることはできません。
// finalクラス:継承不可
public final class Config { ... }
// finalメソッド:オーバーライド不可
public final void display() { ... }
// final変数:再代入不可
final int MAX_VALUE = 100;
// MAX_VALUE = 200; // コンパイルエラー
finally(ブロック)
「finally」はブロックであり、例外処理(try-catch文)と組み合わせて使用します。
- 重要な後処理のコードを記述するための場所です。
- 例外が発生したかどうか、また例外がキャッチされたかどうかにかかわらず、必ず実行されます。
- ファイルのクローズやデータベース接続の切断など、リソースの解放処理によく使われます。
try {
// 例外が発生する可能性のある処理
} catch (Exception e) {
// 例外発生時の処理
} finally {
// 例外の有無にかかわらず必ず実行される
System.out.println("後処理を実行");
}
なお、Java 7以降ではリソースの自動管理を行う「try-with-resources」構文も利用できるため、多くの場合そちらが推奨されています。
finalize(メソッド)
「finalize」はメソッドであり、Objectクラスに定義されています。
- オブジェクトがガベージコレクタによって回収される直前に呼び出され、リソースの解放などの後始末処理を行うために使用されます。
- ただし、実行タイミングが保証されないため、信頼性の高いクリーンアップ手段とは言えません。
- Java 9以降、finalizeメソッドは非推奨(deprecated)となっており、代わりにAutoCloseableやCleanerなどの仕組みを使うことが推奨されています。
@Override
protected void finalize() throws Throwable {
try {
// オブジェクト破棄前の後始末処理
} finally {
super.finalize();
}
}
3者の違いまとめ
| 項目 | final | finally | finalize |
|---|---|---|---|
| 種類 | キーワード | ブロック | メソッド |
| 主な用途 | クラス・メソッド・変数への制約付与 | 例外処理における必須の後処理 | GC実行前のクリーンアップ |
| 適用対象 | クラス、メソッド、変数 | try-catch文 | オブジェクト |
| 備考 | 継承・オーバーライド・再代入を禁止 | 例外の有無に関係なく必ず実行 | Java 9以降は非推奨 |
このように、「final」は制約を与えるキーワード、「finally」は例外処理で必ず実行されるブロック、「finalize」はオブジェクト回収前の後始末を行うメソッドと、それぞれ明確に役割が異なります。用途を正しく理解して、適切に使い分けましょう。
-
Javaの定数とfinal変数の違いとは?static finalの正しい使い方を解説
Javaにおける定数(Constant)とは定数とは、値が固定されており、プログラム内にそのコピーが1つだけ存在する変数のことです。定数として宣言し、一度値を代入すると、以降はプログラムのどこであってもその値を変更することはできません。C言語と異なり、Javaでは定数を直接サポートしていません。しかし、変数をstaticとfinalの両方で宣言することで、定数を作成することが可能です。staticを付けて宣言すると、その変数はコンパイル時にメモリへロードされます。つまり、プログラム全体でコピーは1つだけしか存在しません。finalを付けて宣言すると、その変数の値を再度変更することができなくなり
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って