2015-10-03 17 views
5

Với phương pháp sau đây:biến địa phương: Lập trình Practices

public int methodOne() { 
    int total = local_int_one + local_int_two; 
    return total; 
} 

public int methodTwo() { 
    return local_int_one + local_int_two; 
} 

1) là sự khác biệt duy nhất trong các phương pháp trên có thể đọc hoặc là có một vi-tối ưu hóa "lợi ích" trong methodTwo()?

2) Việc xác định các biến cục bộ trong phạm vi hẹp có được tránh xa và tránh khi có thể không? (Tôi có thể thấy methodTwo trở thành không thể đọc được nếu một số phép tính phải được thực hiện trong một câu lệnh duy nhất)

+0

Tôi nghĩ bạn đã trả lời câu hỏi của riêng bạn. –

+2

Kiểm tra mã byte. (2) có một ít hướng dẫn hơn. – EJP

+0

@EJP: nếu bạn bật tối ưu hóa thì sao? Hiện tại tôi không có quyền truy cập vào trình xem java bytecode. Nhưng rõ ràng chế độ gỡ lỗi dẫn đến một số loại ánh xạ một đối một. –

Trả lời

5

Câu trả lời ngắn gọn là: methodTwo() hiệu quả hơn.

methodOne() kết quả trong bytecode sau:

public int methodOne(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 istore_1 [total] 
10 iload_1 [total] 
11 ireturn 

Và đây là bytecode cho methodTwo():

public int methodTwo(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 ireturn 

Nhưng lưu ý rằng tối ưu hóa này là quá nhỏ và mã dễ đọc trong trường hợp này vấn đề nhiều hơn sau đó một vài hướng dẫn java.

Nếu bạn cho rằng biến tạm thời sẽ đóng góp vào khả năng đọc mã, thì bằng mọi cách, hãy sử dụng nó.

+0

Gần hai năm sau, tôi muốn thêm một bản tiếp theo ở đây nếu tôi có thể. Vì methodTwo() không thực hiện istore_1, điều này có nghĩa là (trong Java) sẽ không có bước bổ sung nào để thực hiện (vì giá trị chỉ được trả về và không được lưu trữ)? ... vì vậy trong một môi trường quan trọng gc, các biến instantiating trong phạm vi nhỏ nên được shunned? – mcw

+1

@mcw, số nguyên không bị thu thập rác, cũng như các biến cục bộ. Đối với các đối tượng - chúng được tạo trên heap trong mọi trường hợp https://stackoverflow.com/a/27587519/2170192 –

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