2009-07-08 18 views
14

Ne yazık ki Java'yı yaklaşık beş yıldır kodlamamışım ve aşağıdaki kodun nasıl ve niçin çalıştığını kesinlikle hatırlayamıyorum.Bu kurucu, aşağıdaki çift parantezleri ile nasıl çağrılır?

Benzer bir örnek üzerinde tökezledim ve bunu kırdım. Vurgu, yorumun altındaki kısımdadır: Ben kurucu notasyonunu ve ardından bloku çift parantez içinde alamıyorum. Ve ne yazık ki, Java dokümantasyonunda veya Google’ı kullanarak herhangi bir şey bulamıyorum (google? Bu notasyonu/sözdizimi nasıl

  1. denir:

    package syntaxtest; 
    
    public class Main { 
    
        public static void main(String[] args) { 
    
         // What kind of notation is this? 
         MyTest tester = new MyTest() {{ 
          setName("John Johnson"); 
         }}; 
    
         System.out.println(tester.getName()); 
        } 
    } 
    
    
    class MyTest { 
        private String name; 
    
        public String getName() { 
         return name; 
        } 
    
        public void setName(String name) { 
         this.name = name; 
        } 
    } 
    

    Yani benim sorular şunlardır?

  2. Bununla ilgili bazı belgeleri nerede okuyabilirim?

Sanırım birisi bana birinci soruya cevap verebilirse ikinci soruyu kendi başıma cevaplayabileceğimi umuyorum.

Netleştirmek için: Çıktının John Johnson olduğunu biliyorum;) Ama neden çalıştığını bilmiyorum.

+0

aynıdır. Ne olduğunu bildikten sonra, belli oluyor. –

+0

Bu temiz numarayı bir süre önce SO üzerinde görmüştüm, ama aynı zamanda bir kaç sorumsuzluğun da onunla işleri kırmanın kolay olduğunu söyleyen/çok güvenilir olmadığını gördüm. Eğer onu kullanmayı deneyeceksem, şunu düşünürüm: A) O zamandan beri kodu görmek için herkese açıklamak zorundayım, ve B) Bazı araştırmalar yapmak zorundayım. Bu deseni kullanmanın tüm etkilerini anlamak. –

+0

Hızlı ve yardımcı yanıtlar için hepinize teşekkür ederiz! – klekker

cevap

20

Bu double brace initialization olarak da bilinir:

Birinci bağ yeni AnonymousInnerClass oluşturur, ikinci anonim iç sınıfı örneği zaman çalıştırılan bir örneği başlatıcı blok bildirir. "Statik ilklendiriciler" kelime statik önce yerleştirilir ilgili kavram - bu örneği kapsamı sınıfının içinde bildirildiği için başlatıcı bloğunun Bu tür resmen bir "örnek başlatıcı" denir bloğu başlar ve classloader ( http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.6 belirtilen) sınıfı başlatıcı blok herhangi yöntem, alan ve son değişkenler kullanabilirsiniz mevcut yüklenirken tamamlar tamamlamaz hangi kısa sürede sınıf düzeyinde yürütülür ayracı kapsamı, ancak biri olmak zorunda başlatıcılarının yapıcılarından önce çalıştırılmasından emin olun.

Bu yalnızca sınıfları için kullanılmaz, çünkü bir anonim alt sınıf oluşturur.

14

edelim düzeni biraz farklı kod: Burada gördüğünüz ne

MyTest tester = new MyTest() { 
    { 
    setName("John Johnson"); 
    } 
}; 

çift ayracı başlatma denir. Nesne oluşturulduğunda çalıştırılan kodu içeren bir blok olan bir başlatıcı bloğu ile birlikte, MyTest sınıfının anonim bir iç alt sınıfınız var.

Normal olarak, bu kodu yapıcıya koyarsınız, ancak anonim iç sınıflar yapıcılara sahip olamayacağından, kodun olması gerektiğinde çalışmasını garanti etmenin tek yolu budur.

Bunu söyledikten sonra, bunu yapmak biraz çirkin. Daha iyi yollar var. Ancak, ben bir iletmenin harita oluşturmak genellikle aşağıdaki deyimleriyle, zaman zaman kendim kullanırım:

, yeni bir harita oluşturur bunu bastıran
final Map<String, Integer> textToInt = Collections.unmodifiableMap(new HashMap<String, Integer>() {{ 
    put("one", 1); 
    put("two", 2); 
    // etc 
}}); 

, başlatıcı bloğunda kendisine bazı değerleri ekler ve bunu sarar değiştirilemez bir harita. İlk Ne olduğunu anlayarak önce bir süre bakmak zorunda Usenet üzerinde görünce

-5
MyTest tester = new MyTest() {{ 
    setName("John Johnson"); 
}}; 

MyTest tester = new MyTest(); 
tester.setName("John Johnson"); 
+3

Bunlar aynı değil. Onların sonuçları aynı sınıf değildir. Biri MyTest örneğini oluşturur. Diğer, MyTest'in anonim bir alt sınıfının bir örneğini oluşturur. Eşit yönteminiz şöyle görünüyordu: public boolean equals (Diğer nesne) { if (other.class! = MyTest.class) {return false; } // bazı daha kontroller ... } o zaman onları aynı düşünemedim. –

+3

@mangst Bence "Çoğu amaç için iş göremezlik" olduklarını söylemeliydiniz; Burada biraz bilgiçlı olmalısınız - mühendislerin doğası ve hepsi ... –

İlgili konular