Bir inşaatçı neden kendi sınıf dosyasında bir iç sınıf olmak zorunda?


24

Birçok Builder Patternörnek Builder, oluşturduğu nesnenin iç sınıfını oluşturur.

Bu ne Builderinşa ettiğini gösterir, çünkü biraz mantıklı . Ancak, statik olarak yazılmış bir dilde neyin Builderinşa edildiğini biliyoruz .

Öte yandan Builderbir iç sınıftır, sen gerektiğini hangi sınıf bilmek Builderiçini bakmadan oluşturur Builder.

Ayrıca, kurucuyu iç sınıf olarak bulundurmak, dış sınıf tarafından referans alınabileceği için ithalat sayısını azaltır - eğer bunu umursuyorsanız.

Ve sonra Builderaynı paketin içinde olduğu, ancak bir iç sınıfın olmadığı pratik örnekler var StringBuilder. Bunu biliyor Builder gereken bir inşa Stringo kadar adlandırılır çünkü.

BuilderBir iç sınıf yapmak için düşünebildiğim tek iyi sebep , sınıfın Builderadını bilmeden ya da adlandırma kurallarına güvenmeden ne olduğunu bildiğinizdir . Örneğin, eğer StringBuilderbir iç sınıf Stringolsaydım, muhtemelen benim yaptığımdan (spekülatif) daha erken varolduğunu bilseydim.

Builderİç sınıfı yapmanın başka nedenleri var mı, yoksa sadece tercih ve ritüele mi düşüyor?

Yanıtlar:


30

Bunu yapmanın nedeninin iç sınıfın (Oluşturucu) inşa ettiği sınıfın özel üyelerine erişebilmesi için olduğunu düşünüyorum.

Gönderen http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

Statik olmayan iç içe sınıflar (iç sınıflar) özel olarak bildirilse bile, çevreleyen sınıfın diğer üyelerine erişebilir.

...

İki üst düzey sınıfı, A ve B'yi, B'nin aksi takdirde özel ilan edilecek olan A üyelerine erişmesi gerektiğini düşünün. A sınıfındaki B sınıfını gizleyerek, A'nın üyeleri özel ilan edilebilir ve B bunlara erişebilir.

...

Örnek yöntem ve değişkenlerde olduğu gibi, bir iç sınıf, çevreleyen sınıfının bir örneğiyle ilişkilendirilir ve o nesnenin yöntemlerine ve alanlarına doğrudan erişime sahiptir.

İşte bunu açıklamaya çalışacağınız bazı kodlar:

class Example {

    private int x;

    public int getX() { return this.x; }

    public static class Builder {

        public Example Create() {
            Example instance = new Example();
            instance.x = 5; // Builder can access Example's private member variable
            return instance;
        }
    }
}

Statik bir sınıf olarak, Builder'ın kendisine bağlı olduğu belirli bir Örnek örneği yoktur. Bununla birlikte, bir Örnek (veya kendisini yarattığı) bir örnek verildiğinde Oluşturucu yine de bu örneğin özel üyelerine erişebilir.


Harika cevap, bu mantıklı! Bununla birlikte, kurucu modeller genellikle statik bir iç sınıfa sahiptir ve sadece dış sınıfın statik özel üyelerine erişebilecektir. Eğer örnek bir sınıf için bir inşaatçı olsaydı, her türlü tuhaf olurdu.
Nathanial

1
@Nathanial hiç değil, özel durum değişkenlerine de erişilebilir: ideone.com/7DyjDR
amon

1
@nathanial: Evet, ancak oluşturucu sınıfı manipüle etmiyor; yapıcının kendisinin hazırladığı sınıftaki bir nesneyi manipüle ediyor.
Robert Harvey,

@amon Orada ne yaptığını gördüm. Açıklama için teşekkürler!
Nathanial

Spesifik olarak, yapıcıya, inşa edilmekte olan sınıf için özel bir yapıcıya erişim sağlayarak, o sınıfın değişmez olmasına izin verir (tüm alanlar nihai) ve yalnızca oluşturucu aracılığıyla başlatılabilir.
Matthew McPeak

1

Bu durumda "zorunluluk" yoktur. Yapıcıyı başka bir sınıf içinde tanımlamak veya ayırmak, Oluşturucu desenine diktir. Pek çok örnek bunu, kodu tek bir tutarlı dosyada sunma kolaylığı nedeniyle (aynı zamanda özel üyelere erişmek için de geçerlidir, ancak içeriğe de bağlıdır). Aksi halde yapmaktan çekinmeyin


Bu cevabın neden reddedildiğinden emin değil, başka bir nedenden ötürü, "çünkü Java’da böyle yapmıyoruz." Oluşturucu Deseni, bir demet parametre alan bir kurucu etrafına bir sarıcı sağlar. Yapıcı bu parametreleri alırsa, Builder nesnesinin özel üyelere erişmesine gerek yoktur.
Greg Burghardt,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.