2009-09-02 25 views
8

Khi phương pháp tái cấu trúc, rất dễ dàng để giới thiệu tính không tương thích nhị phân (với các phiên bản trước của mã) trong Java.Phương pháp được tái cấu trúc và khả năng tương thích nhị phân trong Java

xem xét thay đổi một phương pháp để mở rộng các loại hình tham số của mình cho một giao diện cha mẹ:

void doSomething(String x); 

// change it to 

void doSomething(CharSequence c); 

Tất cả các mã có sử dụng phương pháp này sẽ tiếp tục biên dịch mà không thay đổi, nhưng nó đòi hỏi một tái biên dịch (vì các tệp nhị phân cũ sẽ thất bại với MethodNotFoundError).

Cách kéo phương thức vào lớp cha. Điều này đòi hỏi phải biên dịch lại?

// before 
public class B extends A{ 
    protected void x(){}; 
} 

// after 
public class A { 
    public void x(){}; 
} 
public class B extends A{} 

Phương pháp đã được chuyển từ B sang cha mẹ A. Nó cũng đã thay đổi mức độ hiển thị từ bảo vệ thành công cộng (nhưng đó không phải là vấn đề).

Tôi có cần duy trì "trình bao bọc khả năng tương thích nhị phân" trong B hay nó sẽ tiếp tục hoạt động (tự động gửi đến lớp cha)?

// do I need this ? 
public class B extends A{ 
    // binary compatibility wrapper 
    public void x(){ super.x(); } 
} 

Trả lời

12

"Mở rộng" ảnh hưởng đến chữ ký của phương pháp này để không tương thích nhị phân. Di chuyển một phương thức tới một siêu lớp không ảnh hưởng đến chữ ký của phương thức, vì vậy nó sẽ hoạt động. Eclipse có một tài liệu tuyệt vời mà mô tả API và khả năng tương thích ABI:

http://wiki.eclipse.org/Evolving_Java-based_APIs

quy tắc rõ ràng hơn là trong phần 2:

http://wiki.eclipse.org/Evolving_Java-based_APIs_2

Tôi tin rằng bạn đang quan tâm đến việc "Thay đổi loại một tham số chính thức "(nghĩa là, những gì bạn gọi là mở rộng) hoặc" Di chuyển API lên phương pháp phân cấp kiểu "(nghĩa là, những gì bạn gọi là kéo vào lớp cha).

-1

Nó nên tiếp tục làm việc tự động như Java có động liên kết

+0

Tôi nghĩ điều tương tự về các phương pháp mở rộng ... Điều đó không có tác dụng vì tên lớp của đối số trở thành một phần của tên phương thức nội bộ. Tôi tự hỏi, nếu điều tương tự cũng đúng với tên của lớp mà trình biên dịch nghĩ là khai báo phương thức. – Thilo

+1

"Mở rộng" ảnh hưởng đến chữ ký của phương thức, nhưng việc di chuyển phương thức đến một siêu lớp thì không. Hãy thử nó trên dòng lệnh. –

+0

@ bkail: làm cho câu trả lời đó, để tôi có thể bỏ phiếu. – Thilo

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