Helpex - Trao đổi & giúp đỡ Đăng nhập
68

Tôi có một câu hỏi cơ bản trong Java, nhưng đó là một câu hỏi chung trong OOP. Tại sao giao diện cho phép các trường được thiết lập? Điều đó không chạy ngược lại với những gì một giao diện phải làm?

Theo cách tôi hiểu về nó, một giao diện là thứ trong tiếng Anh sẽ là một tính từ. Vì vậy, nếu lớp của tôi triển khai các giao diện Runnable và Seriablizable, tôi đảm bảo với người dùng rằng lớp của tôi sẽ đáp ứng các điều kiện để có thể Runnable và Seriablizable. Tuy nhiên, điều đó có nghĩa là các giao diện là "không trạng thái", nhưng chúng được phép có các trường trong Java ...

Tui bỏ lỡ điều gì vậy?

68 hữu ích 1 bình luận 88k xem chia sẻ
84

Tất cả các trường trong giao diện public static final, tức là chúng là hằng số.

Thông thường, bạn nên tránh các giao diện như vậy, nhưng đôi khi bạn có thể tìm thấy một giao diện không có phương thức và chỉ được sử dụng để chứa danh sách các giá trị không đổi.

84 hữu ích 5 bình luận chia sẻ
22

Trước hết, có sự khác biệt giữa mô hình OOPtriển khai OOP trong Java , vì vậy những từ giống nhau có thể có nghĩa hơi khác nhau.

Trong OOP, giao diện mô hình là những gì bạn có thể làm với đối tượng (hoặc đối tượng có thể làm gì cho bạn ). Bất kỳ đối tượng nào cũng có thể có một số giao diện và do đó đóng các vai trò khác nhau. Ví dụ, một người nào đó có thể làm việc như một lập trình viên và có thể tạo ra các chương trình, nhưng đồng thời anh ta có thể là một người chồng, người cha và do đó có thể trả các hóa đơn cho gia đình và chăm sóc con cái. Ở đây "lập trình viên", "chồng" và "cha" là các giao diện, và một người là một đối tượng thực hiện chúng. Lưu ý rằng các giao diện không ngụ ý sự hiện diện của bất kỳ tính năng (trường) cụ thể nào để triển khai đối tượng, chỉ là các hành động mà đối tượng này có thể thực hiện.

Java ít nhiều tuân theo ý tưởng này, nhưng như bất kỳ triển khai mô hình nào cũng có các tính năng riêng của nó. Java cho phép mô tả các phương thức, đó là các hành động mà đối tượng triển khai có thể thực hiện, nhưng không phải bất kỳ chi tiết triển khai nào, do đó, không có gì về các trường đối tượng hoặc các phương thức riêng.

Nhưng những gì về hằng số ( public final statictrường)? Chúng là một phần của quá trình thực hiện hay giao diện. Nó có thể là cả hai. Ví dụ: giao diện "lập trình viên" có thể WORK_HOURSđặt hằng số thành "8". Do đó, Java cũng cho phép bạn mô tả các hằng số trong các giao diện.

Lưu ý rằng Java chỉ giúp bạn thiết kế OOP tốt, nhưng nó không đòi hỏi nhiều. Đặc biệt, không phải tất cả các phương thức công khai của một đối tượng cũng nên tồn tại trong giao diện. Ví dụ, các phương thức getter và setter thường là công khai, nhưng trên thực tế, chúng là một phần của việc triển khai , không phải giao diện, và do đó, không nên đưa chúng vào giao diện.

(Cũng xin lưu ý rằng hầu hết những điều tôi mô tả ở đây là về OOP chính thống như trong Java, nhưng cũng có những loại OOP khác như OOP dựa trên nguyên mẫu, cụ thể là được triển khai trong JavaScript).

22 hữu ích 0 bình luận chia sẻ
7

Điều gì sẽ xảy ra nếu giao diện đó tham chiếu đến các hằng số? Sẽ không tự nhiên khi khai báo chúng trong giao diện?

interface IdFinder {
    Serializable UNSAVED = new Serializable() {};

    /** @returns the given entity's persistent identity, 
                 or {@link UNSAVED} if it hasn't been saved yet, 
                 or null if o is a value object that hasn't a 
                 persistent identity of its own.
     */
    Serializable getId(Object o);
}
7 hữu ích 0 bình luận chia sẻ
3

Có, bạn có thể có các trường không đổi trong giao diện, nhưng bạn đã đúng khi nói rằng "nó có vẻ trái ngược với những gì một giao diện phải làm", vì đó không phải là một thực tiễn tốt. Tại sao bạn muốn có tất cả các lớp của mình triển khai một giao diện với các hằng số giống nhau? Bạn chỉ cần có chúng trong lớp sử dụng chúng, hoặc nếu bạn thực sự cần xuất chúng bằng cách nào đó, hãy đặt chúng trong một lớp riêng biệt như thế này:

public class Constants {
    private Constants() { }

    public static final int ZERO = 0;
    public static final int SOME_COMPLEX_NUM = 2124132L;
    ...
}

Bạn cũng có enums, nếu bạn cần đại diện cho một tập hợp các trường hằng số với một số ý nghĩa. Tôi không thấy bất kỳ "trường hợp sử dụng" nào mà bạn thực sự cần hằng số trong một giao diện. Nhưng có thể sai :)

3 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java oop interface , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading