Tôi đang làm việc với một số mã trong đó một đối tượng, "foo", đang tạo một đối tượng khác, "thanh" và chuyển nó Callable
. Sau khi foo này sẽ trả về thanh và sau đó tôi muốn foo không thể truy cập được (ví dụ: có sẵn cho bộ sưu tập rác).Làm các lớp ẩn danh * luôn luôn * duy trì một tham chiếu đến cá thể kèm theo của chúng?
Suy nghĩ ban đầu của tôi là chỉ cần tạo một tên ẩn danh Callable
. ví dụ:
class Foo {
...
public Bar createBar() {
final int arg1 = ...
final int arg2 = ...
final int arg3 = ...
return new Callable<Baz>() {
@Override
public Baz call() {
return new Baz(arg1, arg2, arg3);
}
};
}
}
Nó xảy ra với tôi rằng điều này có thể không thực sự làm việc như mong muốn, tuy nhiên, như một lớp bên trong thường giữ một tham chiếu đến đối tượng kèm theo của nó. Tôi không muốn tham chiếu đến lớp kèm theo ở đây, vì tôi muốn đối tượng kèm theo là được thu thập trong khi vẫn có thể truy cập được Callable
.
Mặt khác, phát hiện các trường hợp kèm theo là không bao giờ thực sự được gọi nên được khá tầm thường, vì vậy có lẽ trình biên dịch Java là đủ thông minh để không bao gồm một tài liệu tham khảo trong trường hợp đó.
Vì vậy, ... một thể hiện của một lớp bên trong ẩn danh có giữ tham chiếu đối với trường hợp kèm theo của nó ngay cả khi nó không bao giờ thực sự sử dụng tham chiếu mẫu kèm theo?
Chắc chắn sử dụng lớp tĩnh. Nó không phải là IMO dài dòng. –
@deepc Bạn cần thêm các trường cho mỗi tham số, đó là 1 dòng cho mỗi tham số và một hàm tạo, có thêm 2 dòng cộng 1 cho mỗi tham số. Vì vậy, đối với một Runnable 3 đối số đơn giản, đó là ít nhất 8 dòng mã. Cú pháp lớp bên trong vô danh đã khá dài dòng so với cú pháp biểu thức lambda đúng: một lớp phương thức duy nhất có 4 dòng của bản mẫu mà bạn không cần với các biểu thức lambda. Vì vậy, một biểu thức lambda 1 dòng 1 tham số trong Java sẽ trở thành 13 dòng mã. Làm thế nào lớn nó sẽ được cho bạn để xem xét nó "mà tiết"? –
bạn phù hợp với dòng "thống kê" của mình. Có lẽ đó là sở thích cá nhân. Nhưng sau khi tất cả phương thức 'call()' cũng phải ở trong đó. Và bây giờ chúng tôi có đủ mã để biện minh cho một lớp riêng biệt (không nhất thiết phải là một lớp cấp cao nhất khi bạn chỉ ra). Với tôi mã trông sạch hơn theo cách này. Thậm chí nhiều hơn như vậy nếu phương pháp đó dài hơn một vài dòng. –