2014-12-01 15 views
6

Tôi đang cố gắng sử dụng Java 8 lambdas và có câu hỏi chung về tuần tự hóa đối tượng. Ví dụ: đầu vào sau in 5 nếu executor.execute chỉ có một phương thức và chạy khối mã mà không cần tuần tự hóa nó. Tuy nhiên nếu tôi tuần tự hóa biểu thức lambda qua SerializedLambda và deserialize nó trở lại, nó in null vì nó không có bối cảnh trước đó trong đối tượng deserialized mới này. Hơn nữa, nó biên dịch mà không có bất kỳ khiếu nại nào kể từ bối cảnh đầu tiên giải quyết các biến bên ngoài. (FinalVar trong ví dụ này):Bao gồm các biến bên ngoài khi tuần tự hóa một đối tượng

final int finalVar = 5; 
executor.execute(() -> { 
    System.out.println(finalVar); 
}); 

Tôi tự hỏi liệu nó có thể nói với SerializedLambda bao gồm finalVar vào đầu ra tuần tự mà không cần thực hiện một giao diện mà có một lĩnh vực cho biến finalVar và thiết lập giá trị của nó vào một lĩnh vực khi xây dựng. AFAIK, đây là cách sạch nhất để làm điều như vậy trong Java:

final int finalVar = 5; 
executor.execute(new Runnable() { 
    int myVar = finalVar; 

    public void run() { 
     System.out.println(myVar); 
    } 
); 

Tôi thậm chí không chắc chắn về điều đó nhưng tôi nghĩ rằng trình biên dịch có thể tìm hiểu các biến bên ngoài và cũng có thể serialize và bao gồm họ khi tôi cố gắng tuần tự hóa lambda. Có bất kỳ thủ thuật nào cho Java để làm điều đó hay không có bất kỳ ngôn ngữ nào có tính năng như vậy?

+0

Có, lambdas được tuần tự hóa sẽ tự động bao gồm các biến đã chụp mà không có bất kỳ phép thuật đặc biệt nào. –

+0

Có lẽ nó liên quan đến lỗi Eclipse được mô tả ở đây: http://stackoverflow.com/questions/23837215/java-8-lambdas-that-access-instance-fields-and-methods-cant-be-deserialized –

+0

các phiên bản hệ điều hành/IDE/Java của bạn? Tôi không thể tái tạo điều này. – alexh

Trả lời

0

Bất kể phạm vi biến, lambdas được tuần tự hóa sẽ bao gồm các biến bên ngoài miễn là các loại biến đó là Serializable. Hãy chắc chắn rằng đó là trường hợp và bạn tốt để đi.

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