2014-12-01 13 views
6

Java 8 lambda kullanmaya çalışıyorum ve nesne serileştirme hakkında genel bir sorum var. Örneğin, executor.execute yalnızca bir yönteme sahipse ve serileştirmeden kod bloğunu çalıştırıyorsa aşağıdaki giriş 5 yazdırılır. Ancak, SerializedLambda aracılığıyla lambda ifadesini serileştirir ve onu yeniden seri hale getirirsem, bu yeni serileştirilmiş nesnede bir önceki bağlam olmadığı için boş yazdırır. Ayrıca, ilk bağlam dış değişkenleri çözdüğü için herhangi bir şikayette bulunmadan derlenmektedir. (Bu örnekte finalVar):Bir nesneyi serileştirirken dış değişkenler içeriyor

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

Ben finalVar değişken için bir alan vardır, arabirim uygulama olmadan seri çıkışı içine finalVar dahil etmek SerializedLambda anlatmak ve bir alanda ne zaman bunun değerini ayarlamak mümkün olup olmadığını merak inşa. AFAIK, bu Java böyle bir şey yapmak için en temiz yoludur:

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

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

Bu konuda bile emin değilim ama derleyici serialize de dış değişkenleri öğrenmek ve düşünüyorum ve ben çalıştığınızda onları da lambda serileştirir. Java'nın böyle bir şey yapması için herhangi bir hile var mı yoksa böyle bir özelliği olan herhangi bir dil var mı?

+0

Evet, seri hale getirilmiş lambdalar özel büyüler olmadan otomatik olarak yakalanan değişkenleri içermelidir. –

+0

Belki de burada açıklanan Eclipse hata ile ilgilidir: http://stackoverflow.com/questions/23837215/java-8-lambdas-that-access-instance-fields-and-methods-cant-be-deserialized –

+0

Nelerdir? OS/IDE/Java sürümleriniz Bunu yeniden üretemiyorum. – alexh

cevap

0

Değişken kapsamından bağımsız olarak, seri hale getirilmiş lambdalar, bu değişkenlerin türleri Serializable olduğu sürece dış değişkenleri içerecektir. Durumun bu olduğundan emin ol ve gitmek için iyisin.