Giả sử rằng chúng ta cần triển khai một số phương thức java trong mã gốc và hiển thị nó cho người dùng. Chúng tôi biết rằng tất cả công việc được thực hiện theo khía cạnh gốc, nghĩa là trách nhiệm duy nhất của mã java là chuyển đối số do người dùng cung cấp tới mã gốc và trả lại kết quả. Theo đó, lớp java có thể được thực hiện theo hai cách:Phương pháp gốc Java. Công khai và riêng tư
Bằng cách sử dụng các phương pháp tự nhiên được tiếp xúc trực tiếp với người sử dụng:
public native Object doSmth(Object arg0, Object arg1);
Bằng cách sử dụng các wrapper công cộng mỏng xung quanh phương pháp có nguồn gốc tin :
public Object doSmth(Object arg0, Object arg1) { return nativeDoSmth(arg0, arg1); } private native Object nativeDoSmth(Object arg0, Object arg1);
tôi đã nhìn thấy cả hai phương pháp trong các dự án thực tế và thậm chí cả cựu và sau này trong cùng một dự án. Vì vậy, câu hỏi của tôi là: có bất kỳ lựa chọn thay thế được đề cập có một số lợi thế kỹ thuật hoặc hiệu suất hoặc bảo trì, mà nên khuyến khích chỉ sử dụng một biến thể. Hay có lẽ đó chỉ là vấn đề về hương vị?
Phương thức 'công khai' là một phần của API đối tượng. Phương thức 'nguyên gốc 'là một quyết định thực hiện. Không được hiển thị chi tiết triển khai cho API công khai. Tùy chọn 2 ẩn triển khai khỏi API. – Andreas
Bạn sẽ tìm thấy tùy chọn 2 được sử dụng độc quyền trong JDK, không phải tùy chọn 1. Tôi nghĩ đó là một ý tưởng hay, nó mang lại cho bạn một mức độ tự do khác khi thiết kế và duy trì lớp JNI của bạn. – EJP
Câu hỏi của bạn giả định rằng chữ ký giống nhau. Điều này thường không phải là trường hợp bởi vì những gì tự nhiên cho API của lớp học có thể là rất nhiều công việc trong mã JNI. Trong nhiều trường hợp, việc chuyển đổi các đầu vào và đầu ra đơn giản hơn bằng cách sử dụng Java thành các kiểu dữ liệu dễ dàng hơn trong JNI. –