2016-04-06 13 views
9

Từ Java hiệu quả 2nd edition, mục 17:Khi lập kế hoạch cho kế thừa, các cấu tử có được phép gọi phương thức overridable không?

Đối với mỗi phương pháp công cộng hoặc bảo vệ hoặc nhà xây dựng, tài liệu phải chỉ ra phương pháp overridable phương pháp hoặc constructor gọi

Cuối cùng mặt hàng có nội dung:

Các nhà xây dựng không được gọi phương pháp có thể ghi đè trực tiếp hoặc gián tiếp.

Không phải hai câu này mâu thuẫn, hay tôi thiếu gì đó?

+0

Bạn có thể đọc nó theo nghĩa không mâu thuẫn: nó có thể không đúng là một tài liệu của nhà xây dựng cho biết tất cả các phương thức overridable được gọi, nếu không có phương thức overridable nào được gọi. Nhưng tôi nghi ngờ đó không phải là tinh thần mà trong đó nó được viết, cũng không phải là ý nghĩa của bạn :) –

+0

Không thực sự, bạn nên ghi lại thành viên nào bạn có thể ghi đè lên, chỉ để ai đó có thể ghi đè chúng, và sau đó không thể nói > "hey, nhưng bạn không bao giờ thông báo cho tôi ghi đè điều này hoặc điều đó sẽ không có > bất kỳ tác dụng phụ nào" Điều đó sang một bên, sẽ luôn có người thay đổi phương thức trong lớp học của họ. là tốt nhất không bao giờ làm điều này. – Stultuske

Trả lời

1

Gọi phương pháp có thể ghi đè trong khi xây dựng là Được phép - không có gì bất hợp pháp về việc này.

Gọi phương pháp overridable trong quá trình thi là không nên - Nó nói chung là thiếu khôn ngoan để gọi các phương pháp overridable trong quá trình thi vì điều này có thể gây ra đối tượng không đầy đủ để được tiếp xúc và hạn chế khả năng dự báo của hệ thống.

public class A { 

    final int a; 

    public A() { 
     a = method(); 
    } 

    protected int method() { 
     return 42; 
    } 

    @Override 
    public String toString() { 
     return "A{" + "a=" + a + '}'; 
    } 

} 

public class B extends A { 

    @Override 
    protected int method() { 
     System.out.println("this=" + this); 
     return 96; 
    } 

} 

public void test() { 
    System.out.println("B = " + new B()); 
} 

Lưu ý rằng trích dẫn đầu tiên của bạn chỉ đề cập đến tài liệu chứ không phải mã. Tôi sẽ đề xuất vấn đề duy nhất là việc sử dụng phải khi nên có thể sẽ phù hợp hơn.

Các vấn đề liên quan