SORU
4 AĞUSTOS 2010, ÇARŞAMBA


'in nesi geçersiz kılınabilir kurucular yöntemi çağırır?

Sayfa Başlığı soyut bir yöntem sonucuna bağlı olarak ayarlayan Wicket sayfa Dersim var.

public abstract class BasicPage extends WebPage {

        public BasicPage() {
                add(new Label("title", getTitle()));
        }

        protected abstract String getTitle();

}

Eclipse mesajı ile beni uyarıyor "geçersiz kılınabilir bir yöntem oluşturucu çağrısı", ama ne olmalıdır? Tahmin edebiliyorum tek alternatif, alt sınıflar süper kurucusuna aksi takdirde soyut yöntemler sonuçlarını iletmektir. Ama bu çok parametre ile okumak zor olabilir.

CEVAP
4 AĞUSTOS 2010, ÇARŞAMBA


Kurucular itibaren geçersiz kılınabilir bir yöntem çağırma

Basitçe söylemek gerekirse, bu kadar gereksiz yere olanakları, çünkü yanlışBİRÇOKböcekler. @Override çağrıldığında, nesne durumu tutarsız ve/veya eksik olabilir.

Bir alıntıEtkili Java 2. Baskı, Madde 17: miras için Tasarım ve belge veya yasaklamak başka:

Bir itaat sınıf kalıtım sağlamak için gereken birkaç kısıtlamalar vardır.Kurucular geçersiz kılınabilir yöntemleri çağırmak gerekirdoğrudan ya da dolaylı olarak. Eğer bu kuralı ihlal ederseniz, program hatası neden olur. Üst sınıf yapıcısı, alt sınıf yapıcısı önce ishal, alt sınıfta geçersiz kılma yöntemi, alt sınıf yapıcısı tükendi önce çağrılır. Eğer geçersiz kılma yöntemi herhangi bir başlatma, alt sınıf yapıcısı tarafından gerçekleştirilen bağlıdır, bu yöntem beklendiği gibi davranır.

Burada göstermek için bir örnek:

public class ConstructorCallsOverride {
    public static void main(String[] args) {
        abstract class Base {
            Base() { overrideMe(); }
            abstract void overrideMe(); 
        }
        class Child extends Base {
            final int x;
            Child(int x) { this.x = x; }
            @Override void overrideMe() {
                System.out.println(x);
            }
        }
        new Child(42); // prints "0"
    }
}

Base çağrı yapıcı ne zaman buraya overrideMe, Child final int x başlatma tamamlandıktan ve yöntemi yanlış değerini alır. Bu neredeyse kesinlikle hatalar ve hatalara yol açacaktır.

İlgili sorular

Ayrıca Bkz


Birçok parametre ile nesne yapımı

Birçok parametrelerle kurucular zavallı okunabilirlik yol açabilir, ve daha iyi seçenekler var.

İşte bir alıntıEtkili Java 2. Baskı, Madde 2: çok yapıcı parametreleri ile karşı karşıya builder deseni Düşünün:

Geleneksel olarak, programcılar kullanmışteleskopik yapıcıyalnızca gerekli parametreleri ile bir kurucu verdiğiniz desen, başka bir isteğe bağlı parametre, iki isteğe bağlı parametreler ile, ve benzeri... üçüncü bir tek

Teleskopik kurucu desen aslında böyle bir şey

public class Telescope {
    final String name;
    final int levels;
    final boolean isAdjustable;

    public Telescope(String name) {
        this(name, 5);
    }
    public Telescope(String name, int levels) {
        this(name, levels, false);
    }
    public Telescope(String name, int levels, boolean isAdjustable) {       
        this.name = name;
        this.levels = levels;
        this.isAdjustable = isAdjustable;
    }
}

Ve şimdi aşağıdakileri yapabilirsiniz:

new Telescope("X/1999");
new Telescope("X/1999", 13);
new Telescope("X/1999", 13, true);

Ancak, şu anda sadece name ve 15* *varsayılan levels terk edebilirsiniz. Sen-ebilmek sağlamak daha yapıcı aşırı, ama belli sayıda ki patlayacak gibi parametre sayısı büyür, ve hatta birden fazla boolean int argümanlar, hangi gerçekten bir karışıklık çıkmış şeyler.

Bu yaz için hoş bir desen değil görmek, ve her zaman daha keyifli olarak Ne ("gerçek" ne demek? 13?).

Bloch bunun yerine gibi bir şey yazmak için izin verecek builder desenini kullanarak önerir

Telescope telly = new Telescope.Builder("X/1999").setAdjustable(true).build();

Şimdi parametreleri olarak adlandırılır unutmayın, ve istediğiniz herhangi bir sırayla onları ayarlayabilirsiniz, ve varsayılan değerleri saklamak istediğiniz olanları atlayabilirsiniz. Bu özellikle aynı tür pek çok ait parametreler çok sayıda var elbet teleskopik kurucular çok daha iyi.

Ayrıca Bkz

İlgili sorular

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LivestrongWoman

    LivestrongWo

    1 Aralık 2011
  • PoreoticsHD

    PoreoticsHD

    22 NİSAN 2010
  • TROPFEST

    TROPFEST

    27 Mart 2007