SORU
28 AĞUSTOS 2009, Cuma


Java HashMap vs nesneleri Göster

Ne ben oluşturmak aşağıdaki haritalar arasındaki fark (başka bir soru, insanlar görünüşte onları birbirinin yerine kullanarak cevap verdi ve eğer onlar farklı nasıl merak ediyorum):

HashMap<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map = new HashMap<String, Object>();

CEVAP
28 AĞUSTOS 2009, Cuma


Nesneler arasında fark yoktur. Bir fark yokturarayüzünesne var. İlk durumda, ikinci arabirimini Map<String, Object> buna HashMap<String, Object>,. Temel nesne olsa da, aynıdır.

Map<String, Object> kullanmanın avantajı kullanıyor herhangi bir kod ile sözleşme bozmadan haritanın farklı bir tür temel nesne değişiklik olabilir. Eğer HashMap<String, Object> olarak bildirirseniz eğer temel uygulama değiştirmek isterseniz sözleşmenizi değiştirmek zorunda.


İnsanlar örnekler görmek istiyorlar yorumladı. Hadi bu sınıf yazıyorum ki:

class Foo {
    private HashMap<String, Object> things;
    private HashMap<String, Object> moreThings;

    protected HashMap<String, Object> getThings() {
        return this.things;
    }

    protected HashMap<String, Object> getMoreThings() {
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

Sınıf dize -^ iç haritalar bir çift var . paylaştığı nesne (erişimci yöntemleri) alt ile. Ben bu sınıfı yazarken kullanmak için uygun bir yapı olduğunu düşünüyorum çünkü HashMaps ile yazmak.

Daha sonra, Mary kod sınıflara yazar. O bir şey ihtiyacı olan ilgisi de things moreThings, Bu yüzden doğal olarak o koyar yaygın bir yöntem olduğunu ve onun kullandığı aynı tip kullanılan getThings/getMoreThings tanımlarken onun yöntemi:

class SpecialFoo extends Foo {
    private void doSomething(HashMap<String, Object> t) {
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }

    // ...more...
}

Daha sonra, aslında, eğer Foo 17 *yerine* 18 *kullanırsam daha iyi olduğuna ben karar veririm. Ben Foo, TreeMap 21 *değişen güncelleştirin. Sözleşme kırdım çünkü şimdi, SpecialFoo artık derleme değildir,: Foo HashMaps sağladı, ama şimdi bunun yerine TreeMaps sağlamak olduğunu söylerdi. SpecialFoo şimdi (ve bu tür bir şey ile bir kod temeli dalgalanma olabilir) düzeltmek için var.

Sürece yaşadığım bir çok iyi bir neden için bu benim paylaşım uygulaması kullanarak bir HashMap (o olur), yapmam gerekeni olduğunu bildirmek getThings getMoreThings gibi dönen Map<String, Object> olmadan daha açık Daha. Aslında, engelleme, ki zaten başka bir şey yapmak, hatta içinde Foo bence en iyisi ilan things moreThings Map değil HashMap/TreeMap:

class Foo {
    private Map<String, Object> things;             // <== Changed
    private Map<String, Object> moreThings;         // <== Changed

    protected Map<String, Object> getThings() {     // <== Changed
        return this.things;
    }

    protected Map<String, Object> getMoreThings() { // <== Changed
        return this.moreThings;
    }

    public Foo() {
        this.things = new HashMap<String, Object>();
        this.moreThings = new HashMap<String, Object>();
    }

    // ...more...
}

Şimdi Map<String, Object> ben her yerde, sadece gerçek nesne oluşturduğumda net kullanıyorum nasıl not.

Eğer öyle yapsaydım, o zaman Meryem bunu yapardı:

class SpecialFoo extends Foo {
    private void doSomething(Map<String, Object> t) { // <== Changed
        // ...
    }

    public void whatever() {
        this.doSomething(this.getThings());
        this.doSomething(this.getMoreThings());
    }
}

...ve Foo değiştirme SpecialFoo derleme stop etmezdi.

Arabirimler (ve sınıflar) bizi ifşa edelimsadece çok gerekliuygun olarak değişiklik yapmak için yorganın altına esnekliğimiz tutmak. Genel olarak, referanslarımız olabildiğince temel olmak istiyoruz. Eğer gerek olsaydı zaten HashMap, Map bir çağrı.

Bu kör bir kural değil ama genel olaraken genel arayüz kodlamabir şey daha spesifik kodlama için daha az kırılgan olacak. Eğer hatırlamış olsaydım, Mary SpecialFoo ile başarısızlık için ayarladığınız Foo oluşturulan zorunda kalmazdım. EğerMaryvardı hatırladığım kadarıyla, o halde ben berbat Foo, o-cekti var ilan onu özel yöntemi ile Map yerine HashMap ve benim değiştirme Foo'nın sözleşme yapmazdım etkiledi onun kodu.

Bazen, bazen açık olmalısın bunu yapamazsın. Ama olmak için bir nedeniniz yoksa, en doğru, en azından özel arayüzü err.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Charles Renaud

    Charles Rena

    10 Kasım 2007