Tôi nghĩ rằng việc sử dụng một giao diện cho hằng chia sẻ là một ví dụ về nhầm lẫn hai khái niệm khác nhau:
- Mã tái sử dụng
- subtyping
Theo kinh nghiệm của tôi sử dụng subclassing, hoặc giao diện thực hiện đơn giản để ngăn chặn việc sao chép mã dẫn đến sự cố. Mã của bạn trở nên mong manh hơn. Ví dụ: ai đó có thể vô tình xác định lại hằng số - đặc biệt nếu phân cấp lớp của bạn có nhiều lớp sâu.
Tốt hơn nên sử dụng bố cục để giữ mã của bạn KHÔ.
Một vấn đề khác khi sử dụng thừa kế theo cách này là nói chung loại thừa kế này tạo thành một phần của API của lớp học của bạn. Hệ thống phân cấp của lớp được hiển thị bên ngoài lớp. Điều này phá vỡ đóng gói.Bạn không cần phải vạch trần việc sử dụng các hằng số bên ngoài lớp, chúng phải làm với cách bạn đã chọn để triển khai lớp học của bạn và không phải là một phần của API của nó (trong ví dụ của bạn).
Điều này có thể dẫn đến các sự cố tương thích ngược đáng kinh ngạc. Một người nào khác có thể đến và viết mã như thế này:
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return CONST * input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
Bây giờ, nếu bạn quyết định không còn cần phải sử dụng CONST trong MyClass thì bạn đang mắc kẹt. Bởi vì ThirdPartyClass đã tạo ra một sự phụ thuộc vào CONST có sẵn trong MyClass.
Bạn có thể kết thúc với điều này. Trường hợp MyClass không sử dụng bất kỳ hằng số nào trong giao diện, nhưng vẫn phải thực hiện nó.
public interface Constants {
static final int CONST = 2;
}
public class MyClass implements Constants {
int doSomething(int input) {
return input;
}
}
public class ThirdPartyClass {
int doSomethingElse(int input) {
return MyClass.CONST + input;
}
}
Tóm lại; không bao giờ làm điều này!
(+1), nó không mô phỏng nó hoàn toàn, bởi vì nó không hoạt động cho nhập khẩu tĩnh các phương thức – Bozho
Thực ra, có một số logic tròn trong đối số này. Chúng tôi không kế thừa các lớp duy nhất liên tục vì bạn có thể sử dụng nhập tĩnh. Nhưng tại sao chúng ta nên sử dụng nhập khẩu tĩnh cho rằng chúng ta có thể kế thừa giao diện? Ngay cả gọi nó là một "hack" mà không nói lý do tại sao nó được coi là một "hack" giống như lặp lại câu thần chú "phong cách xấu". –
Sự khác biệt là nhập khẩu tĩnh là một tính năng ngôn ngữ được giới thiệu cụ thể để cho phép điều này, trong khi mục đích của giao diện là khá khác nhau; do đó, bằng cách sử dụng một giao diện như thế này là một hack; Tôi nghĩ điều đó không cần nói. –