2010-01-12 33 views
10

Xét đoạn mã sau:Các lớp ẩn danh "caching" của Java có được không?

for(int i = 0;i < 200;i++) 
{ 
    ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 
    // do something with currentList 
} 
  • Làm thế nào Java sẽ đối xử với lớp của currentList?
  • Nó sẽ coi nó là một lớp khác nhau cho mỗi trong số 200 đối tượng?
  • Đây có phải là lần truy cập hiệu suất ngay cả sau khi đối tượng đầu tiên được tạo không?
  • Bộ nhớ đệm có bằng cách nào đó không?

Tôi chỉ tò mò :)

+3

Afaik một lớp ẩn danh là một lớp đơn giản chỉ với một tên được tạo. chỉ có bấy nhiêu thôi. Caching được thực hiện như với mọi class trong classloader. – ZeissS

+0

thực sự điều này sẽ tạo ra một lỗi trình biên dịch: 'i' không phải là cuối cùng, đó sẽ là ý tưởng tồi cho bộ đếm vòng lặp. Nhưng một câu hỏi hay! –

Trả lời

15
ArrayList<Integer> currentList = new ArrayList<Integer>() {{ 
    add(i); 
    }}; 

đang tạo ra một mới dụ của lớp ẩn danh mỗi lần qua vòng lặp của bạn, nó không phải xác định lại hoặc tải lại lớp mỗi lần. Lớp được định nghĩa một lần (tại thời gian biên dịch) và được nạp một lần (khi chạy).

Không có hiệu suất đáng kể nào khi sử dụng các lớp ẩn danh.

+2

... và tham chiếu "currentList" sẽ không thể truy cập được sau vòng lặp for và được tạo lại. Theo nghĩa đó, đối tượng mà nó tham chiếu (thể hiện lớp bên trong) sẽ được đánh dấu để thu thập rác ngay lập tức. – OscarRyz

15

Trình biên dịch sẽ chuyển đổi mọi lớp ẩn danh thành một lớp bên trong có tên. Vì vậy, mã của bạn, sẽ được chuyển thành một cái gì đó dọc theo các dòng:

class OuterClass$1 extends ArrayList<Integer> { 
    OuterClass$1(int i) { 
     super(); 
     add(i); 
    } 
} 

for (int i = 0; i < 200; i++) { 
    ArrayList<Integer> currentList = new OuterClass$1(i); 
} 
Các vấn đề liên quan