Từ cuốn sách java hiệu quả bởi Joshua Bloch
mục 19: Sử dụng giao diện duy nhất để xác định các loại
Khi một lớp thực hiện một giao diện, giao diện đóng vai trò như một loại có thể được được sử dụng để chỉ các cá thể của lớp. Do đó, một lớp thực hiện một giao diện do đó nên nói điều gì đó về một khách hàng có thể làm gì với các trường hợp của lớp . Không thể xác định một giao diện cho bất kỳ mục đích nào khác.
Một loại giao diện không thực hiện được thử nghiệm này là giao diện không đổi. Giao diện như vậy không chứa phương thức nào; nó chỉ bao gồm các trường cuối cùng tĩnh, mỗi trường xuất một hằng số. Các lớp sử dụng các hằng số này thực hiện giao diện để tránh sự cần thiết phải đủ điều kiện tên không đổi với tên lớp. Dưới đây là một ví dụ:
// Constant interface antipattern - do not use!
public interface PhysicalConstants {
// Avogadro's number (1/mol)
static final double AVOGADROS_NUMBER = 6.02214199e23;
// Boltzmann constant (J/K)
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// Mass of the electron (kg)
static final double ELECTRON_MASS = 9.10938188e-31;
}
Các mô hình giao diện thường xuyên là một người nghèo sử dụng các giao diện. Đó là một lớp sử dụng một số hằng số nội bộ là một chi tiết thực hiện. Triển khai giao diện không đổi làm cho chi tiết triển khai này bị rò rỉ vào API được xuất của lớp học. Nó là không có hậu quả cho người dùng của một lớp mà lớp thực hiện một giao diện không đổi. Trong thực tế, nó thậm chí có thể gây nhầm lẫn cho họ. Tệ hơn nữa, nó đại diện cho một cam kết: nếu trong bản phát hành trong tương lai, lớp được sửa đổi để nó không còn cần phải sử dụng các hằng số, nó vẫn phải triển khai giao diện để đảm bảo khả năng tương thích nhị phân. Nếu lớp nonfinal thực hiện một giao diện không đổi, tất cả các lớp con của nó sẽ có các không gian tên bị ô nhiễm bởi các hằng số trong giao diện.
Có một số giao diện không đổi trong các thư viện nền tảng Java, chẳng hạn như java.io.ObjectStreamConstants. Các giao diện này nên được coi là bất thường và không được mô phỏng.
Nếu bạn muốn xuất các hằng số, có một số lựa chọn hợp lý. Nếu hằng số được gắn chặt với một lớp hoặc giao diện hiện có, bạn nên thêm chúng vào lớp hoặc giao diện. Ví dụ, tất cả các lớp nguyên thủy số nguyên đóng hộp, chẳng hạn như Integer và Double, xuất các hằng số MIN_VALUE và MAX_VALUE. Nếu các hằng số được xem tốt nhất là thành viên của một loại được liệt kê, bạn nên xuất chúng với loại enum (Mục 30). Nếu không, bạn nên xuất các hằng số với lớp tiện ích không thể khôi phục (khoản 4). Dưới đây là một phiên bản lớp tiện ích của PhysicalConstants ví dụ trên:
// Constant utility class
package com.effectivejava.science;
public class PhysicalConstants {
private PhysicalConstants() {
} // Prevents instantiation
public static final double AVOGADROS_NUMBER = 6.02214199e23;
public static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
public static final double ELECTRON_MASS = 9.10938188e-31;
}
Thông thường một lớp tiện ích đòi hỏi khách hàng để đủ điều kiện tên thường xuyên với một tên lớp , ví dụ, PhysicalConstants.AVOGADROS_NUMBER. Nếu bạn thực hiện việc sử dụng hằng số các hằng số được xuất bởi lớp tiện ích, bạn có thể tránh sự cần thiết phải đủ điều kiện cho các tên hằng số bằng cách sử dụng cơ sở nhập tĩnh, được giới thiệu trong bản phát hành 1.5:
// Use of static import to avoid qualifying constants
import static com.effectivejava.science.PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
}
...
// Many more uses of PhysicalConstants justify static import
}
Nói tóm lại, giao diện nên chỉ được sử dụng để xác định các loại. Không được sử dụng để xuất các hằng số.
Bạn có thể tạo biến loại giao diện nếu giao diện được lớp thực hiện? Tôi đã đọc rằng đây là một cách tốt hơn để tạo một biến trong một lớp vì nếu bạn thêm các phương thức mới, bạn không phải thay đổi mọi cá thể của biến trong lớp. lớp A triển khai Binterface {Binterface = myInterface; sau đó ic gọi các phương thức trong giao diện giống như định nghĩa lớp thông thường. Tại sao woudl này là trường hợp và những gì lợi ích tôi sẽ có thể từ một tuyên bố như vậy? –