Java 9のtry-with-resourcesで使える「事実上final(effectively final)」変数とは?
Java 8までのバージョンでは、try-with-resources文で使用する変数は、必ずtry文の中で宣言する必要がありました。しかし、Java 9以降ではこの制限が撤廃され、finalまたは事実上final(effectively final)な変数であれば、tryブロック内でそのまま利用できるようになりました。
「事実上final」とは、一度初期化された後に値が変更されない変数のことを指します。明示的にfinal修飾子を付けていなくても、再代入が行われていない変数はコンパイラによって事実上finalとみなされます。
コード例
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class EffectivelyFinalTest {
private static File file = new File("try_resources.txt");
public static void main(String args[]) throws IOException {
file.createNewFile();
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
try(bufferedReader) {
System.out.println("Can Use Final or Effectively Final in Try with Resources!");
} finally {
System.out.println("In finally block");
}
}
}実行結果
Can Use Final or Effectively Final in Try with Resources! In finally block
この例では、bufferedReaderはtry文の外で宣言されていますが、初期化後に再代入されていないため事実上finalとして扱われ、Java 9のtry-with-resourcesで問題なく使用できます。この機能により、リソースの宣言位置に柔軟性が生まれ、より簡潔で読みやすいコードを書けるようになりました。
-
Javaのfinal変数とは?使い方と定数宣言の基本を解説
Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共
-
Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説
finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意