2015-02-11 21 views
7

Geçerli JDK 1.8 uygulamasının sonucu olarak, lambda işlevini tutmak ve bu nesne üzerindeki işlevi çağırmak için anonim bir nesne oluşturur. Bu anonim nesne her çağrıda yeniden kullanılıyor mu, yoksa her defasında bir nesne yeniden mı oluşturuluyor? Bu yeniden kullanılabilirJava lambda anonim nesneyi yeniden kullanılıyor mu?

+0

olarak Hatırladığım kadarıyla lamdas nesneler içine derlenmemiş. Bunun yerine, tanımlandıkları sınıf yöntemlerine dönüştürülürler. – mkrakhin

+0

@mkrakhin http://www.lambdafaq.org/are-lambda-expressions-objects/ –

+0

Ben bir bağlantı bulamadık, ama Oracle mühendisleri örnekleri olarak lambdas uygulamaması kararı aldıklarını, söylendi bir makale okudum anonim sınıflar. Bu yaklaşımın, ClassLoaders için ek çalışmalar ve meta-boşlukta ek ayak izi nedeniyle performansı etkileyeceğini söylediler. – mkrakhin

cevap

2

, bu olmayabilir de. JLS 15.27.4 kaynaktan

:

ya aşağıdaki tahsis başlatıldı özellikleri, ya da aşağıdaki özelliklere sahip bir sınıfın mevcut örneği ile bir sınıfın yeni bir örneği başvurulmaktadır.

Bir veya diğer olmaya bağımlı olamaz. Derleyici ve/veya çalışma zamanı, en iyi sonucu verecek olanı seçebilir. (Bu anonim sınıfların üzerinde lambdas faydalarından biridir - her zaman bile anonim sınıfına, new kullandıkları için, yeni bir nesne olması sağlanır, bunlar bile, bunu tekrar kullanarak bunu optimize etmek mümkün değildir Aynı nesne olup olmadıklarını umursamadığınız zamanın% 99'u.)

Lambda'nın değişkenleri, kapsama alanından yakaladığı durumda, genellikle nesneyi yeniden kullanmak mümkün değildir. yakalanan değişkenlerin değeri lambda nesnesinde saklanan durumdur ve lambda her değerlendirildiğinde (kaynak kodunda aynı lambda olsa bile), yakalanan değişkenlerin farklı değerlerini yakalayabilir. Sadece derleyici lambda'nın iki özel değerlendirmesinin, aynı değişken değerlerini yakalaması gerektiğini garanti ederse, derleyici nesneyi yeniden kullanabilir. Lambda herhangi bir değişken yakalayamaz halinde

, o lambda her örneklemi davranış aynıdır. Bu durumda, bu lambda'nın tüm değerlendirmeleri için tek bir nesne yeniden kullanılabilir. Mevcut Java uygulamasının bu durumda programın süresi boyunca yalnızca bir kopya ayırdığına inanıyorum. Ancak bu sadece uygulamaya bağlı bir optimizasyon.

+0

1. Çevresel kapsam değişkenini yakalamak için genellikle yöntemdeki değişkenler için doğrudur; ama sanırım sınıf düzeyi değişkenlerine atıfta bulunularak tekrar kullanılması gerekir. 2. Bazı kanıtlar verebilir ve/veya yeniden kullanılabilirlik hakkında genel uygulama ve mantığı tartışır mısınız? Oracle JDK ve OpenJDK. Yeniden kullanılabileceğini biliyorum, ancak bayt kod derleyici veya JIT'nin ne zaman ve nasıl yapılacağını bilmek güzel. –

+0

Ayrıca, bu uygulamanın standart değil JVM'ye özgü olduğunu söyleyen belge bağlantınız var mı? –

+1

@AlexSuoL: 1. Belirli bir bakış açısından, * yalnızca * yerel değişkenler "yakalanabilir". "Sınıf seviyesi değişkenleri" ile ne demek istediğini bilmiyorum. Örnek değişkenlere her zaman üye referansı ile erişilebilir; eğer belirtilmemişse dolaylı olarak budur. "Bu", tüm örnek yöntemlerde etkili bir yerel yerel değişkendir ve örnek değişkenler veya yöntemler kullanılıyorsa diğer yerel değişkenler gibi lambdalarda yakalanır. Bu, bir yönteme yapılan farklı çağrılar arasında değişebilir, bu nedenle diğer yakalanan yerel değişkenler gibi depolanması gerekir. Statik değişkenler "yakalanmış" değildir. – newacct

İlgili konular