Gần đây tôi đã nhận thấy có một tùy chọn để có các phương thức tĩnh trong giao diện. Tương tự như với các trường tĩnh của giao diện, có một hành vi thú vị: Chúng không được kế thừa.
Tôi không chắc nó có hữu ích trong các giao diện thực tế sẽ được triển khai không. Tuy nhiên, nó cho phép lập trình viên tạo các giao diện chỉ là phong bì cho các công cụ tĩnh, ví dụ như các lớp tiện ích.
Một ví dụ đơn giản chỉ là một phong bì cho các hằng số toàn cầu. So với một lớp, bạn có thể dễ dàng nhận thấy cái nồi hơi bị thiếu public static final
như những cái được giả định (làm cho nó ít dài dòng hơn).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Bạn cũng có thể làm cho một cái gì đó phức tạp hơn, như giả khóa này của các phím cấu hình.
public interface ConfigKeys {
static createValues(ConfigKey<?>... values) {
return Collections.unmodifiableSet(new HashSet(Arrays.asList(values)));
}
static ConfigKey<T> key(Class<T> clazz) {
return new ConfigKey<>(clazz);
}
class ConfigKey<T> {
private final Class<T> type;
private ConfigKey(Class<T> type) {
this.type = type;
}
private Class<T> getType() {
return type;
}
}
}
import static ConfigKeys.*;
public interface MyAppConfigKeys {
ConfigKey<Boolean> TEST_MODE = key(Boolean.class);
ConfigKey<String> COMPANY_NAME = key(String.class);
Set<ConfigKey<?>> VALUES = createValues(TEST_MODE, COMPANY_VALUE);
static values() {
return VALUES;
}
}
Bạn cũng có thể tạo một số "lớp" tiện ích theo cách này. Tuy nhiên, trong các tiện ích, thường hữu ích khi sử dụng các phương thức trợ giúp riêng tư hoặc được bảo vệ, điều này không hoàn toàn khả thi trong các lớp.
Tôi coi đó là một tính năng mới hay và đặc biệt là các thành viên tĩnh không được thừa hưởng là một khái niệm thú vị chỉ được giới thiệu cho các giao diện.
Tôi tự hỏi nếu bạn có thể coi nó là một thực hành tốt. Mặc dù phong cách mã và thực tiễn tốt nhất không phải là tiên đề và có chỗ cho ý kiến, tôi nghĩ thường có những lý do hợp lệ ủng hộ ý kiến.
Tôi quan tâm nhiều hơn đến lý do (không) sử dụng các mẫu như hai loại này.
Lưu ý rằng tôi không có ý định thực hiện các giao diện đó. Họ chỉ đơn thuần là một phong bì cho nội dung tĩnh của họ. Tôi chỉ có ý định sử dụng các hằng hoặc phương thức và có thể sử dụng nhập tĩnh.
default
phương pháp. Tôi đang nói về static
phương pháp và lĩnh vực. Những người không được thừa kế, vì vậy họ không phá vỡ nhiều di sản.