Giao diện riêng tư có được sử dụng trong các quyết định thiết kế không? Nếu vậy, lý do và khi nào bạn biết sự cần thiết cho một giao diện riêng tư?Quyết định thiết kế: Tại sao và khi nào để đặt giao diện riêng tư?
Trả lời
IMHO Bạn không thể tạo giao diện riêng tư một cách hữu ích.
Tuy nhiên, tôi thường có hai giao diện, một giao diện để sử dụng công khai và một cho sử dụng nội bộ. Giao diện sử dụng nội bộ tôi tạo gói nội bộ nếu có thể, ví dụ:
public interface MyInterface {
public void publicMethod();
}
interface DirectMyInterface extends MyInterface {
public void internalUseOnlyMethod();
}
Phương pháp sử dụng nội bộ hiển thị các phương pháp tôi không muốn các nhà phát triển khác sử dụng và/hoặc tôi muốn có thể thay đổi dễ dàng. Lý do tôi có giao diện ở tất cả là tôi có một số triển khai mà tôi muốn sử dụng nội bộ thông qua một giao diện.
Vì mục đích nào bạn cần gói sử dụng nội bộ? Trong hơn 10 năm kinh nghiệm về Java, tôi chưa từng nói về mẫu này - nhưng bạn nói bạn sử dụng nó ** thường **. – Mot
Tôi thường viết thư viện hoặc khung được sử dụng bởi các nhà phát triển khác. Tôi muốn giữ cho các giao diện càng đơn giản càng tốt, vì vậy bất kỳ phương pháp nào tôi có thể ẩn đi tôi đều đặc biệt. nếu chúng không được các nhà phát triển khác sử dụng. –
Nó phải được gói bảo vệ nếu giao diện nếu sử dụng nội bộ. Nói chung, nếu giao diện không có bất kỳ lợi ích nào bên ngoài thì đó là một quyết định thiết kế api tốt to hide it vì có ít phức tạp hơn cho người dùng giao diện và cũng cho phép bạn cấu trúc lại dễ dàng hơn, bởi vì khi giao diện được công khai và trong API bạn mất tự do để thay đổi nó.
A giao diện cấp cao nhất không thể là riêng tư. Nó chỉ có thể có public
hoặc quyền truy cập gói. Từ số Java Language Specification, section 9.1.1: "Interface Modifiers":
Bộ điều khiển truy cập được bảo vệ và riêng tư liên quan đến tuyên bố lớp học (§8.5.1).
Một lồng nhau giao diện có thể private
bất cứ khi nào nó và lớp con của nó, nếu có, là một chi tiết thực hiện nó lớp top-level.
Ví dụ: giao diện lồng nhau CLibrary
bên dưới được sử dụng làm chi tiết triển khai của lớp cấp cao nhất. Nó được sử dụng hoàn toàn để xác định một API cho JNA, được truyền thông bởi giao diện Class
của giao diện.
public class ProcessController {
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid();
}
public static int getPid() {
return CLibrary.INSTANCE.getpid();
}
}
Ví dụ khác, giao diện riêng này xác định API được sử dụng bởi các lớp lồng nhau riêng triển khai biểu tượng định dạng tùy chỉnh.
public class FooFormatter {
private interface IFormatPart {
/** Formats a part of Foo, or text.
* @param foo Non-null foo object, which may be used as input.
*/
void write(Foo foo) throws IOException;
}
private class FormatSymbol implements IFormatPart { ... }
private class FormatText implements IFormatPart { ... }
...
}
Tôi thích ví dụ thứ hai của bạn. –
@JordanStewart - Cảm ơn. Đó là một ví dụ rất đơn giản từ một số mã trong thế giới thực. –
khi giao diện về nội dung nào đó phải được trừu tượng ra khỏi tất cả mã không nằm trong gói cụ thể? – thejh
Giao diện chỉ có thể là riêng tư nếu đó là giao diện lồng nhau. Một lớp hoặc giao diện phức tạp có thể công khai hoặc gói riêng tư. – Mot