Language
class initialization: static fieldは宣言順に初期化される
クラス初期化ではstatic fieldの初期化式がソース上の宣言順に評価されます。
SourceStaticOrder.java
Java 21
package examples.initialization;
import java.util.ArrayList;
import java.util.List;
public final class StaticOrder {
private static final List<String> EVENTS = new ArrayList<>();
private static final String FIRST = record("first");
private static final String SECOND = record("second");
private StaticOrder() {}
private static String record(String event) {
EVENTS.add(event);
return event;
}
public static List<String> events() {
return List.copyOf(EVENTS);
}
public static String second() {
return SECOND;
}
}TestStaticOrderTest.java
Java 21
package examples.initialization;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.Test;
class StaticOrderTest {
@Test
void staticFieldは宣言順に初期化される() {
assertEquals("second", StaticOrder.second());
assertEquals(List.of("first", "second"), StaticOrder.events());
}
}01Assertion
このテストで確認できること
- 先に宣言したstatic fieldの初期化を先に記録する
- 後のfieldへアクセスすると宣言順の結果を読める
static初期化子で別のfieldへ依存する設計は、宣言順に意味を持たせます。初期化を複雑にせず、依存を明示します。
OBSERVED RESULT
expected: [first, second]
actual: [first, second]