2009-12-22 36 views
18

Lấy ví dụ sau đây:Các biến cục bộ Java cuối cùng được lưu ở đâu?

public void init() { 
    final Environment env = new Environment(); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

Thứ nhất, nơi được env lưu trữ? Là nó:

  • sao chép bởi trình biên dịch thành một biến thành viên ẩn của lớp bên trong tham chiếu đến nó
  • sao chép vào, và được giới thiệu trên, đống
  • trái trên stack và bằng cách nào đó tham chiếu có
  • cái gì khác

My đoán là tùy chọn đầu tiên. Thứ hai, thực hiện bất kỳ vấn đề hiệu suất nào phát sinh từ việc này (thay vì chỉ đơn giản là tạo ra env làm biến thành viên của lớp và tham chiếu nó), đặc biệt nếu bạn đang tạo số lượng lớn các cấu trúc lớp bên trong. biến.

Trả lời

18

Có, chúng được sao chép, đó là lý do tại sao bạn phải khai báo biến này là cuối cùng. Bằng cách này, họ được đảm bảo không thay đổi sau khi bản sao đã được thực hiện.

Điều này khác với các trường mẫu, có thể truy cập ngay cả khi không phải là cuối cùng. Trong trường hợp này, lớp bên trong nhận một tham chiếu đến cá thể bên ngoài mà nó sử dụng cho mục đích này.

private Environment env; // a field does not have to be final 

public void init() { 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     public void run() { 
      env.close(); 
     } 
    }); 
} 

Thứ hai, bạn có gặp phải vấn đề về hiệu suất nào khi thực hiện việc này không?

So với những gì? Bạn cần phải có trường hoặc biến xung quanh để lớp bên trong của bạn làm việc, và một bản sao là một cách rất hiệu quả. Nó chỉ là một bản sao "nông" anyway: chỉ là tham chiếu đến (trong ví dụ của bạn) Môi trường được sao chép, chứ không phải bản thân Môi trường.

+0

Vì vậy, tôi có thể giả định không có vấn đề về hiệu suất phát sinh từ việc này không? – Joel

+0

Peeve vật nuôi cá nhân của tôi trong lĩnh vực này là các tài liệu tham khảo cho trường hợp bên ngoài (được sử dụng để truy cập các lĩnh vực, không biến, được sao chép) có thể là một vấn đề, nếu họ không cần thiết: http://stackoverflow.com/questions/ 758570/is-it-possible-to-make-anonymous-bên trong-lớp-trong-java-static – Thilo

+0

so với tham chiếu nó như là một biến thành viên. Nếu nó được sao chép, sau đó, giả định của tôi là không có tác động hiệu quả. – Joel

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