Yorumlarda belirtildiği gibi, bunların bazıları final
örtük olabilen Java 8'de önemsiz hale gelir . Anonim bir iç sınıf veya lambda ifadesinde sadece etkili bir son değişken kullanılabilir.
Temel olarak Java'nın kapanışları yönetme biçimi nedeniyle .
Anonim bir iç sınıf örneği oluşturduğunuzda, o sınıfta kullanılan tüm değişkenlerin değerleri olur otomatik olarak oluşturulmuş kurucu aracılığıyla kopyalanır. Bu, derleyicinin, örneğin C # derleyicisinin yaptığı gibi, "yerel değişkenlerin" mantıksal durumunu tutmak için çeşitli ekstra türleri otomatik olarak oluşturmak zorunda kalmasını önler ... (C #, anonim bir işlevde bir değişkeni yakaladığında, gerçekten değişkeni yakalar - kapatma, değişkeni yöntemin ana gövdesi tarafından görülen bir şekilde güncelleyebilir (veya tam tersi.)
Değer, anonim iç sınıf örneğine kopyalandığından, değişkenin yöntemin geri kalanıyla değiştirilebilmesi garip görünecektir - eski bir değişkenle çalışıyor gibi görünen bir kodunuz olabilir ( bu etkili bir şekilde ne çünkü olurdu gerçekleşiyor ... Eğer farklı bir zamanda alınan bir kopyasını) çalışacaksın. Benzer şekilde, anonim iç sınıf içinde değişiklikler yapabiliyorsanız, geliştiriciler bu değişikliklerin ekteki yöntemde görünür olmasını bekleyebilirler.
Değişkenin sonlandırılması tüm bu olasılıkları ortadan kaldırır - değer hiç değiştirilemediğinden, bu değişikliklerin görünür olup olmayacağı konusunda endişelenmenize gerek yoktur. Yöntemin ve anonim iç sınıfın birbirlerinin değişikliklerini görmesine izin vermenin tek yolu, değiştirilebilir bir tür açıklama kullanmaktır. Bu, içine alan sınıfın kendisi, bir dizi, değiştirilebilir bir sarmalayıcı türü ... böyle bir şey olabilir. Temel olarak bir yöntemle diğeri arasında iletişim kurmak gibi: bir yöntemin parametrelerinde yapılan değişiklikler arayan tarafından görülmez, ancak parametrelerle atıfta bulunulan nesnelerde yapılan değişiklikler görülür.
Eğer Java ve C # kapanışları arasında daha ayrıntılı bir karşılaştırma ilgilenen ediyorsanız, bir var makale ayrıntılı bir şekilde yardımcı gider. Bu cevapta Java tarafına odaklanmak istedim :)