2013-04-02 41 views
9

Câu hỏi của tôi là trong suốt toàn bộ Android API rất nhiều thư viện các cuộc gọi yêu cầu một tham số results[] được chuyển vào phương pháp ví dụ:Tại sao API Android yêu cầu thông số kết quả thay vì phương thức trả lại?

public boolean isInProximity(double startLat, double startLongitude, float meters) { 
    float[] results = new float[3]; 
    Location.distanceBetween(startLat, startLongitude, endLatitude, endLongitude, results); 
    return results[0] <= meters; 
} 

Các cuộc gọi đến android là Location.distanceBetween() và nó đòi hỏi sự results[] tại sao họ không bao gồm chữ ký trả lại cho phương thức? Tôi giả định rằng đó là một số loại bộ nhớ hoặc tối ưu hóa tốc độ. Tôi không chắc chắn về lý do chính xác đằng sau nó.

+7

Có lẽ để cho bạn sự linh hoạt để vượt qua trong cùng một đối tượng (mảng trong trường hợp này) với nhiều lời gọi của các phương pháp, do đó ngăn chặn sự cần thiết cho bộ nhớ phân bổ trên mỗi cuộc gọi. –

+0

Vì vậy, tôi giả sử rằng tôi đang làm điều đó sai bằng cách có 'phao cá nhân [] kết quả = new float [3];' @RobI – Hones

+0

Không nhất thiết. Nếu bạn không mong đợi phương thức đó được gọi thường xuyên (ví dụ, chỉ khi người dùng nhấp vào một nút), nó sẽ không tạo ra sự khác biệt. Nếu mã của bạn đang gọi nó hàng triệu lần, bạn có thể xem xét làm cho mảng đó một trường để giảm phân bổ. –

Trả lời

2

Bạn đúng, đó là về tối ưu hóa, theo cách đó bạn có thể gọi phương thức này nhiều lần mà không cần phân bổ bộ nhớ mỗi lần.

Chỉnh sửa - Đây là thử nghiệm để: http://codeyarns.com/2010/10/21/c-return-value-versus-output-parameter/
Tốt hơn tôi không bao giờ đoán.

+13

Câu trả lời này sẽ được cải thiện rõ rệt bằng cách trích dẫn một hoặc hai tham chiếu. –

+0

Tại sao bạn phải cấp phát bộ nhớ để trả về một giá trị có kích thước - đăng ký đơn? Ngay cả Jitter đơn giản nhất cũng chỉ đưa giá trị trả về vào 'r0' (cũng' s0' ở đây) trên ARM - không có bộ nhớ nào được cấp phát .. – Voo

+0

ok, ok, ở đó ... –

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