Statik olmayan iç sınıflar için mevcut olan özellik erişiminin yüksek eşleşmeye yol açtığını, dolayısıyla daha düşük kod kalitesine yol açtığını ve (anonim olmayan ve yerel olmayan ) iç sınıfların genellikle statik olması gerektiğini varsaymakta haklısınız.
İç sınıfı statik olmayan hale getirme kararının tasarım sonuçları Java Puzzlers , Puzzle 90'da (aşağıda belirtilen alıntı kalın yazı tipindedir) benimdir:
Ne zaman bir üye sınıfı yaz, kendine sor, Bu sınıfın gerçekten bir ek örneğe ihtiyacı var mı? Cevap hayır ise, yap static
. İç sınıflar bazen yararlı olabilir, ancak bir programı anlaşılmasını zorlaştıran komplikasyonları kolayca ortaya koyabilirler. Bunlar, jenerik (Yapboz 89), yansıma (Yapboz 80) ve kalıtım (bu yapboz) ile karmaşık etkileşimlere sahiptir . Eğer bildirirseniz Inner1
olmak static
, sorun kaybolduktan. Ayrıca bildirirseniz Inner2
olmak static
güzel bir ikramiye gerçekten:, aslında programın ne yaptığını anlayabilir.
Özetle, bir sınıfın hem iç sınıf hem de diğerinin alt sınıfı olması nadiren uygundur. Daha genel olarak, bir iç sınıfı genişletmek nadiren uygundur; Gerekirse, ekli örnek için uzun ve sıkı düşünün. Ayrıca, static
iç içe sınıfları olmayanlara tercih edin static
. Çoğu üye sınıfı ilan edilebilir ve ilan edilmelidir static
.
Eğer ilgileniyorsanız, daha ayrıntılı bir analiz Puzzle 90 sağlanmıştır yığın taşması bu cevap .
Yukarıdakilerin, esasen Java Sınıfları ve Nesneleri eğitiminde verilen kılavuzun genişletilmiş bir versiyonu olduğunu belirtmek gerekir :
Çevreleyen bir örneğin genel olmayan alanlarına ve yöntemlerine erişmeniz gerekiyorsa statik olmayan bir iç içe sınıf (veya iç sınıf) kullanın. Bu erişime gerek duymuyorsanız statik iç içe bir sınıf kullanın.
Yani, sorunun cevabı size sorulan bir başka deyişle öğretici başına, sadece inandırıcı nedeni bir çevreleyen örneğinin kamuya açık olmayan alanlar ve yöntemlere erişim olduğunda dışı statik kullanmaktır gerekli .
Öğretici ifadeler biraz geniştir (Java Puzzlers'ın onu güçlendirmeye ve daraltmaya çalışmasının nedeni bu olabilir). Özellikle, doğrudan iliştirilen örnek alanlarına doğrudan erişme deneyimimde hiçbir zaman gerekli olmadı - bu bağlamda bunları yapıcı / yöntem parametreleri olarak geçirmek gibi alternatif yollar her zaman hata ayıklama ve bakım işlemlerini kolaylaştırdı.
Genel olarak, benim (oldukça acı veren), etrafını çevreleyen örnek alanlarına doğrudan erişen iç sınıfların hata ayıklamasıyla karşılaştığında, bu uygulamanın kendisiyle ilişkili bilinen kötülüklerle birlikte küresel devlet kullanımına benzer olduğu izlenimini uyandırdı .
Elbette, Java böyle bir "yarı küresel" nin zararının sınıf içerisine alınmasını sağladı, ancak belirli bir iç sınıfın hata ayıklaması gerektiğinde, böyle bir grup yardımcısının ağrıyı azaltmaya yardımcı olmadığını hissettim: Belirli bir sorunlu nesnenin analizine tamamen odaklanmak yerine "yabancı" anlambilim ve detayları göz önünde bulundurmak.
Bütünlüğün iyiliği için, yukarıdaki akıl yürütmenin uygulanmadığı durumlar olabilir . Örneğin, map.keySet javadocs okumalarıma göre , bu özellik sıkı bağlantı sağlar ve bunun sonucunda statik olmayan sınıflara karşı argümanları geçersiz kılar:
Set
Bu haritada bulunan tuşların görünümünü döndürür . Küme harita tarafından desteklenir, bu nedenle haritadaki değişiklikler kümeye yansır ve bunun tam tersi ...
Yukarıdakilerin bir şekilde ilgili kodun aklınızı korumasını, test etmesini ve hata ayıklamasını kolaylaştıracağını düşünmemekle birlikte, en azından birisinin komplikasyonun amaçlanan işlevsellik ile eşleştiğini / gerekçelendirdiğini iddia etmesine izin vermesi mümkün değildir.