Java Collections singletonMap yöntemini ne zaman kullanırım?


81

Neden java Collections singletonMap'e ihtiyacınız olduğunu anlamıyorum ? Çok iş parçacıklı uygulamalarda yararlı mı?


3
@skaffman: Bu benim hatam olurdu. İlk başta OP'nin Commons sınıfına atıfta bulunduğunu düşündüğüm için SingletonMaponu düzenledim. O zamandan beri değişikliklerimi geri aldım;)
tskuzzy

Yanıtlar:


123

Temel olarak, bunu yapmanıza izin verir:

callAPIThatTakesAMap(Collections.singletonMap(key, value));

bunun yerine:

Map<KeyType, ValueType> m = new HashMap<KeyType, ValueType>();
m.put(key, value);
callAPIThatTakesAMap(m);

Bu, yalnızca tek bir anahtar / değer çiftiniz olduğunda çok daha güzeldir. Bu durum muhtemelen çok sık ortaya çıkmaz, ancak singleton()ve singletonList()oldukça sık yararlı olabilir.


12
Spring'in Adlandırılmış Parametresi JDBC Şablonunu kullanan DAO'larda her zaman singletonMap kullanıyorum. "İd =: barId olduğu çubuktan foo seçin" gibi basit bir seçme ifadeniz varsa, tek bir anahtar / değer çifti olan barId = 123 olan bir parametre eşlemesine ihtiyacınız olacaktır. SingletonMap () kullanmak için harika bir yer.
spaaarky 21

1
Herhangi bir API haritayı girdi olarak alırsa ve Collections.singleton (anahtar, değer) kullanıyorsam, o zaman değişmez eşlemeyi geçiriyorum, bu API için iyi olmayabilir, çünkü API bu haritaya daha fazla öğe ekliyor olabilir ve bu durumda, değişmez olduğu için hiçbir şey yapılamaz.
AKS

2
@AKS: teorik olarak evet, ancak pratikte salt okunur erişim çok daha yaygındır ve girişlerin parametre olarak geçirilen bir haritaya eklenip eklenmediği API belgelerinden anlaşılır olmalıdır.
Michael Borgwardt

@PlabonDutta: Hayır. Bunu deneyerek, API dokümanlarına bakarak ya da sadece "singleton" un ne anlama geldiğini düşünerek bilebilirsiniz.
Michael Borgwardt

15

Bazı genel koda bir harita iletmeniz gerekiyorsa (bir parametre olarak veya bir yöntemin sonucu olarak) ve bu özel durumda bunu biliyorsanız - ancak belki de haritayı aynı genele geçiren diğer durumlarda değil. kod - geçmek istediğiniz haritanın yalnızca tek bir anahtarı vardır. Bu durumda, SingletonMap tam gelişmiş bir harita uygulamasından daha etkilidir ve programcı için daha uygundur çünkü söylemeniz gereken her şey yapıcıda söylenebilir.


8

Ayrıca, Collections.singletonMap () tarafından döndürülen bir SingletonMap uygulaması, normal bir HashMap'ten daha küçük bir bellek ayak izine sahiptir. Yalnızca iki üye alanı içermesi gerekir: anahtar ve değer, oysa bir HashMap dahili bir Node nesneleri dizisi ve diğer üye alanları tutar. Dolayısıyla , bu haritaların çoğunu bellekte oluşturuyorsanız, Collections.singletonMap () kullanmak akıllıca bir seçim olacaktır.


4

Esas olarak kolaylık ve soyutlama için. Bazı API'ler Collectionbir argüman olarak alır ve nesneleri a Setveya Map.

singletonMap()ve singletonList()aslında singletonSet()Java 1.3'te daha sonra tanıtıldı çünkü singletonSet()yararlı olduğu kanıtlandı.


2
SingletonSet () yöntemi yoktur, sadece singleton () olarak adlandırılır
Michael Borgwardt

2

birçok cevap sana ne zaman söyledi, ama ne zaman yapacağımı belirtmek istiyorum not use it

bunu kullanmıyorum eğer istersen put items later on,

çünkü koyacak uygulaması singletonMapatacakUnsupportedOperationException


0

Bu sadece başka bir örnek, ancak şu kod satırını yazdım:

@Override public Map<Action, Promise<Boolean>> actOnResults() throws Exception {
    return Collections.singletonMap(Action.UPDATE_DATABASE, saver.save(results));
}

not edin @Override. Arayüz daha genel olarak birçok şeyin haritasını alabilir; bu belirli örnekleme her zaman bir şeyi içeren bir harita döndürür. Ayrıca haritanın anahtarının bir Enum olduğunu unutmayın. Yani haritaların hiçbir zaman büyük olmaması gerekiyor, sadece hangi eylemler belirtilirse belirtilsin sonuçlarını içermeleri gerekiyor. Benim gerçek örneğimde 5 adede kadar eylem var ve bu örnekleme bunlardan sadece birini kullanıyor.

Tam olmak EnumSetveya EnumMapbu durumlarda genellikle uygundur, ancak bunlar yukarıdaki kodla karşılaştırıldığında yine de can sıkıcı bir şekilde ayrıntılıdır.

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.