it-swarm.asia

Java içinde aşırı "anahtar kelime" kullanımı

Sınıflar ve yöntemler bağlamında final anahtar kelimesinin ne için kullanıldığını ve değişkenler açısından kullanım amacını anlasam da; ancak, yeni çalışmaya başladığım projenin çok fazla olduğu görülüyor ve arkasındaki mantığı merak ediyorum.

Aşağıdaki kod snippet'i sadece kısa bir örnektir, çünkü final ve key değişkenleri için value anahtar sözcüğünde fazla bir nokta görmüyorum:

private <K, V> Collection<V> getValuesForKeys(
    final Map<K, V> map, final Collection<K> keys) 
{
    final Collection<V> values = new ArrayList<V>(keys.size());
    for (final K key : keys) {
        final V value = map.get(key);
        if (value != null) {
            values.add(value);
        }
    }
    return values;
}

Google üzerinden bulduğum makalelerle kullanımı biraz okuyorum; ancak, desen gerçekten derleyicinin kodu optimize etmesine yardımcı olmak gibi şeyler yapıyor mu?

118
rjzii

liberalkullanımıson olduğunu gösteren birçok referans vardır. Java Dil Spesifikasyonu bile son değişkenler hakkında bir bölüm . Statik analiz araçlarındaki çeşitli kurallar da bunu destekler - PMD bile bir finalin ne zaman kullanılabileceğini saptamak için kural sayısı . final'nin ne yaptığına ve neden liberal olarak kullanmanız gerektiğine dair birkaç nokta sağlamak için bağladığım sayfalar .

Benim için final'nin liberal kullanımı çoğu kodda iki şey gerçekleştirdi ve bunlar muhtemelen kod örneğinizin yazarını kullanmak için sürükleyen şeylerdi:

  1. Kodun amacını çok daha net hale getirir ve kendi kendini belgeleyen koda yol açar. final kullanılması, ilkel bir nesnenin değerinin değişmesini veya yeni bir nesnenin yapılmasını ve var olan bir nesnenin üzerine yazılmasını engeller. Bir değişkenin değerini değiştirmeye gerek yoksa ve birisi değiştirirse, IDE ve/veya derleyici bir uyarı sağlayacaktır.) Geliştiricinin sorunu düzeltmesi veya final değiştiricisini Her iki durumda da, amaçlanan sonuca ulaşılmasını sağlamak için düşünce gereklidir.

  2. Kodunuza bağlı olarak, derleyicinin optimizasyonları potansiyel olarak etkinleştirmesi için bir ipucu görevi görür. Bunun derleme zamanı ile ilgisi yoktur, ancak derleyicinin derleme sırasında yapabilecekleri. Ayrıca hiçbir şey yapması garanti edilmez. Bununla birlikte, derleyiciye bu değişkenin veya bu değişken tarafından atıfta bulunulan nesnenin hiçbir zaman değişmeyeceğini bildirmek, potansiyel olarak performans optimizasyonlarına izin verebilir.

Eşzamanlılık ile ilgili başka avantajlar da vardır. Bir sınıf veya yöntem düzeyinde uygulandığında, nelerin geçersiz kılınabileceğini veya devralınabileceğini sağlamakla ilgilidir. Ancak, bunlar kod örneğinizin kapsamı dışındadır. Yine, final'yi nasıl uygulayabileceğiniz konusunda daha derinlemesine incelemek için bağladığım makaleler.

Kod yazarının neden final kullanmaya karar verdiğinden emin olmanın tek yolu yazarı bulmak ve kendiniz istemektir.

127
Thomas Owens

Aklımda "final" in temel faydaları iki yönlüdür:

  • Nihai değişkenler, nihai olmayan değişkenlerden "daha güvenlidir", çünkü bir kez bağlandıklarında, şimdiki durumlarının ne olduğu hakkında hiçbir zaman bir soru yoktur.
  • Yukarıdakilerden dolayı, değişken bir final yapmak programcıyı aşırı zihinsel hokkabazlıktan kurtarır - değişkenin değişip değişmediğini görmek için kodu taraması gerekmez. Bu mutlu durum, işlevsel bir dilde herhangi bir zaman geçirmiş herkese tanıdık gelecektir.

Bu özel örneğe gelince, programcı "nihai" alışkanlığı almış olabilir ve elbette "nihai" anahtar kelimeyi her yere uygulayabilir. (Bireysel ödevler hakkında konuşurken son anahtar kelimenin derleyiciye yardımcı olacağı konusunda kuşkuluyum - şüphesiz sadece bir ödev gerçekleştiğini belirlemek için yardıma ihtiyacı yok mu?)

Ben Java geri aldım - değişkenler için "son" anahtar kelime olmamalıdır, her şey varsayılan olarak "son" olmalıdır ve değişebilir bir değişken istiyorsanız gerekir bunun için bir anahtar kelime eklemeniz gerekir ("var" veya benzeri). (Başka bir yorumcunun belirttiği gibi, scala iki anahtar kelimeye sahiptir - son ve son olmayan değişkenler için "val" ve "var" , sırasıyla - alacağım).

37
nerdytenor

Java içinde final anahtar kelimesinin gerekli olduğu tek yer anonim bir sınıf için güvenilir bir şekilde kullanılabilir değişken (derleyici bu değerin değişmesini gerektiren kapaklar altında bazı hile yapar).

Bildiğim kadarıyla - son anahtar kelimenin Java derleyicisinin kodu optimize etmesine izin verdiği bir efsanedir, önemli olan tüm optimizasyonlar çalışma zamanının JIT kısmında gerçekleşir.

Bu nedenle bir zevk meselesidir. Bununla birlikte, kodun gelecekteki koruyucular için daha kolay okunmasını kolaylaştırmak için çok sayıda final kullanmanın çok önemli bir yararı vardır.

Bir değişkeni final olarak işaretlemek okuyucuya bu değişkenin hiçbir zaman atandığında asla değişmediğini söyler. Bu, kodu okurken, değişkenin ilk atamadakiyle aynı olduğunu bilmeniz ve değişkenin tekrar atandığını görmek için aradaki tüm kodu zihinsel olarak ayrıştırmanız gerekmediğini bildiğinizde çok önemlidir. başka bir şeyle.

Ayrıca, bir değişkenin final ile işaretli işaretli olmadığını görürseniz daha fazla değişti ! Bu, beş karakter eksik olarak okuyucuya iletilebilen son derece önemli bir bilgidir.

Bakımcının işini daha hızlı ve daha güvenilir bir şekilde yapmasına yardımcı olabilecek her şey, uygulamanın bakımının daha ucuz olduğu anlamına gelir! Başka bir deyişle, final gerçek para tasarrufu sağlar.

Not: Eclipse, mümkün olduğunca final ekleyebilen bir "kaynak temizleme" seçeneğine sahiptir. Bu, hem yeni kod yazmak hem de eski kodları korumak için yararlı olabilir (bazıları eksikse, ilk atamadan sonra değişken değişir). Bağırsak hissim, orijinal yazarın keşfettiği ve kullanmaya karar verdiği şey.

Konu daha ayrıntılı olarak ele alınmalıdır https://stackoverflow.com/q/316352/53897

13
user1249

Bunun cevabının diğerlerinin önerdiğinden daha basit olduğunu düşünüyorum. Niyet ya da tasarımla ilgili değil. İyi bir süre önce, bazı yerlerde (özellikle yöntemler ve sınıflar için) final eklemenin JVM'nin daha agresif bir şekilde optimize etmesine izin verdiği doğruydu. Sonuç olarak, bazı insanlar çılgına döndü ve kodlarını daha hızlı gitmek için tam anlamıyla her yerde koydular.

Derleyici değil, optimizasyonu yapan JVM olduğunu eklemeliyim. Dahası, yerel bir değişken üzerinde final yapmak performansta herhangi bir fark yaratacaktır.

Son olarak, JVM optimizasyonları biraz ilerledikçe final kullanmak muhtemelen bu günlerde çok fazla fark yaratmayacaktı.

8
redjamjar

Bana bu bağlamda değişmez bir koleksiyon yapmak için final anahtar sözcüğü kullanılıyor gibi görünüyor. Değişmez koleksiyonlar hakkında daha basit ve eşzamanlılık gerektiren programlarda (daha fazla iş parçacığı) kullanımı daha güvenlidir.

Tabii ki bu doğru değil. final anahtar sözcüğü yalnızca koleksiyona yapılan başvurunun, farklı bir koleksiyona ya da null değerine yapılan bir başvuru ile değiştirilemeyeceğini garanti eder.

1
Robert Harvey