Dấu ngoặc nhọn "bên ngoài" có nghĩa là bạn đang tạo một lớp con ẩn danh, dấu ngoặc thứ hai là bộ khởi tạo đối tượng. Trình khởi tạo được chạy trước hàm tạo của lớp, nhưng sau bất kỳ lệnh gọi super
nào (và do đó cũng sau bất kỳ trình khởi tạo siêu lớp nào). Bạn cũng có thể sử dụng initializers trong các lớp không ẩn danh, đây là cách thuận tiện để khởi tạo các trường final
nếu bạn có nhiều hàm tạo không thể gọi cho nhau hoặc các trường cần khởi tạo phức tạp hơn khởi tạo trường thông thường.
xem xét lớp này:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
public X(A a) throws SomeException {
super(a);
lulz = someCondition()? danger() : 0;
}
public X(B b) throws SomeException {
super(b);
lulz = someCondition()? danger() : 0;
}
}
Nó có thể được viết lại như sau:
class X extends Y{
private final int lulz;
private static boolean someCondition(){...}
private static boolean danger() throws SomeException { ... }
{ // initalizer -- might throw SomeException!
lulz = someCondition()? danger() : 0;
}
public X(A a) throws SomeException { super(a); }
public X(B b) throws SomeException { super(b); }
}
Nếu initializer có thể ném một ngoại lệ kiểm tra, tất cả các nhà xây dựng phải tuyên bố rằng họ có thể ném nó.
Tôi đoán không dễ dàng với google đối với dấu ngoặc kép. –
@Tom Hawtin: Bạn có thể Google cho "cú đúp đúp" thay vì ... –