Tôi đã kết thúc kịch bản sau đây trong mã ngày hôm nay (mà tôi thừa nhận là kinda lạ và tôi đã được refactored). Khi tôi chạy thử nghiệm đơn vị của tôi, tôi thấy rằng một khởi tạo trường không được thiết lập bởi thời gian mà các nhà xây dựng siêu lớp đã chạy. Tôi nhận ra rằng tôi không hoàn toàn hiểu được thứ tự khởi tạo của nhà xây dựng/lĩnh vực, vì vậy tôi đăng bài với hy vọng rằng ai đó giải thích cho tôi thứ tự mà trong đó những điều này xảy ra.Khởi tạo trường đối tượng và thứ tự khởi tạo trong Java
class Foo extends FooBase {
String foo = "foobar";
@Override
public void setup() {
if (foo == null) {
throw new RuntimeException("foo is null");
}
super.setup();
}
}
class FooBase {
public FooBase() {
setup();
}
public void setup() {
}
}
@Test
public void testFoo() {
new Foo();
}
Chữ backtrace viết tắt từ JUnit như sau, tôi đoán tôi dự kiến $ Foo. <init> để đặt foo.
$Foo.setup
$FooBase.<init>
$Foo.<init>
.testFoo