2012-09-24 17 views
6

Anonim sınıflar ve statik iç sınıflar için en iyi uygulama (tasarım ve performans bilgisi) nedir?İç/anonim sınıflar için en iyi yöntem

Şahsen, statik iç sınıfların daha iyi bir kapsülleme sağladığını ve sınıflarının dışındaki sonlandırılmış değişkenlere erişimi olmadığından daha iyi performans vermesi gerektiğini düşünmek isterim. Ama bunu hiç sorgulamadım.

Bununla ilgili bir yazı buldum ama bununla ilgili soruları gerçekten cevaplamadığını hissettim, sadece halklar hakkındaki kişisel düşünceler.

+0

Bu bağlamdaki performans hakkında düşünmedim. Ama tasarım: Tasarım işlevi takip eder. Statik iç içe geçitlerin “en iyi uygulama” olduğu ve anonim morallerin olduğu başka senaryolar olduğu sanırım. – Fildor

+0

Performans muhtemelen göz ardı edilebilir olacak ... Ama bu konuda biraz merak ediyorum. – David

cevap

4

iç sınıflar kendi kapsayan sınıf alanları ve anonim sınıflar olarak yöntemlerine tam olarak aynı erişime sahip anlamak için, Statik iç sınıflar arasındaki fark (iç içe geçmiş sınıflar olarak adlandırılır) ve (normal, statik olmayan) iç sınıflar, statik olanın, bir şeylere erişmek için kapalı sınıfın bir örneğine açık bir referansa gerek duymasıdır. Tabii ki, bunu yapmanız gerektiğinde, genellikle içsel sınıfı yaratan ek sınıfın örneğidir, bu yüzden statik olmayan bir iç sınıfı kullanmak daha kolay ve daha nettir.

Örnekler:

  • (statik olmayan)

    class A { 
        private int field; 
    
        private class B { 
         public void doSomething() { 
          field++; // Valid 
         } 
        } 
    } 
    
  • İç içe sınıfı (yani, "statik iç sınıfı")

    class A { 
        private int field; 
    
        private static class B { 
         public void doSomething(A a) { 
          a.field++; // Valid 
         } 
        } 
    } 
    
  • Anonim sınıfı

    İç sınıf

    class A { 
        private int field; 
    
        public void doSomething() { 
         new Runnable() { 
          @Override 
          public void run() { 
           field++; // Valid 
          } 
         } 
        } 
    } 
    

Bu erişilebilirliği kullanmanız başka bir sorudur. Ekleyen sınıfın özel alanlarına erişirseniz, oluşturulan bir erişimci olacaktır, bu nedenle , bir yönteme çağrı yapma maliyetinin bir alana erişme maliyetiyle aynı olmadığından performansı etkileyebilir, ancak büyük olasılıkla önemsiz olacaktır. çoğu durumda. Herhangi bir ölçüme dayanmayan mikro optimizasyonlar yapmadan önce her zaman doğru kodu (her ikisi de tasarım ve işlevsellik açısından) yazmalısınız. JIT derleyicisi zaten sizin için bir çok şey yapar.

+1

+1: ... kodunun doğru yazılması gerekiyor ... – Jayan

+0

Ana sınıf üyelerine erişimi olmayan iç sınıf (yani statik olmayan üyeler statik içerikten erişilebilir olmayacaktır).Biz buna statik iç içe geçmiş sınıf diyoruz, üst düzey veya bağımsız sınıf gibi çalışıyoruz. –

+0

@LeninkumarKoppoju Aslında, iç içe geçmiş sınıflar olarak adlandırılırlar, daha sonra doğru ismi öğrendim. Cevabı güncelleyeceğim. Bununla birlikte, yuvalanmış bir sınıfın, diğer bir üst düzey sınıftan imkansız olan class_: 'outer.privateInt = 42;' çalışmalarının bir örneğine yaptığı bir referansa sahip olan _if sınıfının herhangi bir üyesine erişimi vardır. –

1

Java kaynak kodu Koleksiyonları ve JDK dizinde src.zip içindedir (örnek olması Desen bakın. Eclipse, bir kitap Effective Java Oku satır içi yardımı

ile kod okuyabilir, bak static, inner ve diğer yararlı interface, enum ve diğer sınıfları nasıl çalıştığını iç sınıf için (statik veya değil)

+0

@ cl-r: Orijinal bağlantı ihlali sağa benziyordu. Ben onu – Jayan

+0

@Jayan ile değiştirdim, teşekkürler, bu sorunu bilmiyordum. –

+0

Uzun zaman önce Bu kitabı gördüm ... Tekrar gözden geçireceğim :) – David