Error Handling
try-with-resources: 複数resourceは逆順にcloseされる
AutoCloseable を複数宣言すると、ブロック終了時には宣言と逆順にcloseされます。
SourceResourceUsers.java
Java 21
package examples.resources;
import java.util.List;
public final class ResourceUsers {
private ResourceUsers() {}
public static void useAndClose(List<String> events) {
try (var resource = new TrackedResource(events)) {
resource.use();
}
}
public static void useTwoAndCloseInReverseOrder(List<String> events) {
try (var first = new TrackedResource(events, "first");
var second = new TrackedResource(events, "second")) {
first.use();
second.use();
}
}
}TestResourceUsersTest.java
Java 21
package examples.resources;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
class ResourceUsersTest {
@Test
void tryWithResourcesは処理後にcloseを必ず呼ぶ() {
var events = new ArrayList<String>();
ResourceUsers.useAndClose(events);
assertEquals(List.of("used", "closed:resource"), events);
}
@Test
void tryWithResourcesは複数のresourceを宣言と逆順にcloseする() {
var events = new ArrayList<String>();
ResourceUsers.useTwoAndCloseInReverseOrder(events);
assertEquals(List.of("used", "used", "closed:second", "closed:first"), events);
}
}01Assertion
このテストで確認できること
- try ブロック内で use が実行される
- 複数のresourceは宣言と逆順に close される
ファイル、ストリーム、DB接続などは try-with-resources で所有期間を明確にします。依存関係のあるresourceではclose順序も設計の一部です。
OBSERVED RESULT
expected: [used, used, closed:second, closed:first]
actual: [used, used, closed:second, closed:first]