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
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ü HashMap
s 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
HashMap
s 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.
Nasıl bir Java HashMap aynı karma kodu...
Java Hashmap: Nasıl anahtar değerini a...
Nasıl bir değeri, bir java hashmap bir...
Java Göster Sipariş...
En verimli şekilde artış Java Göster b...