Trong Java 8, tôi có thể dễ dàng viết:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Tôi sẽ nhận được ngữ nghĩa đồng bộ hóa đầy đủ mà tôi có thể sử dụng trong các lớp. Tuy nhiên, tôi không thể sử dụng công cụ synchronized
sửa đổi trên các khai báo phương thức:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Bây giờ, người ta có thể lập luận rằng hai giao diện hoạt động theo cùng một cách ngoại trừ việc Interface2
thiết lập một hợp đồng trên method1()
và trên method2()
, mạnh hơn một chút so với những gì Interface1
. Tất nhiên, chúng tôi cũng có thể lập luận rằng default
việc triển khai không nên đưa ra bất kỳ giả định nào về trạng thái triển khai cụ thể hoặc từ khóa như vậy đơn giản sẽ không làm giảm sức nặng của nó.
Câu hỏi:
Lý do tại sao nhóm chuyên gia JSR-335 quyết định không hỗ trợ synchronized
các phương thức giao diện là gì?
default synchronized
, nhưng không nhất thiết phải như vậy static synchronized
, mặc dù tôi sẽ chấp nhận rằng cái sau có thể đã bị bỏ qua vì lý do thống nhất.
synchronized
sửa đổi có thể được ghi đè trong các lớp con, do đó sẽ chỉ có vấn đề nếu có một cái gì đó là phương thức mặc định cuối cùng. (Câu hỏi khác của bạn)
synchronized
trong các siêu lớp, loại bỏ hiệu quả đồng bộ hóa. Tuy nhiên, tôi sẽ không ngạc nhiên rằng việc không hỗ trợ synchronized
và không hỗ trợ final
có liên quan, tuy nhiên, có thể do nhiều kế thừa (ví dụ: thừa kế void x()
và synchronized void x()
, v.v.). Nhưng đó là suy đoán. Tôi tò mò về một lý do có thẩm quyền, nếu có.
super
mà yêu cầu thực hiện lại đầy đủ và có thể truy cập vào các thành viên tư nhân. Btw, có một lý do những phương thức đó được gọi là "người bảo vệ" - chúng có mặt để cho phép dễ dàng thêm các phương thức mới.