Skip to main content

Java Concurrent Set and Lifo Queue - Problem with java.util.Collections factory methods

Today I got to know about java.util.Collections.newSetFromMap() method, added in Java 6 (aka Java 1.6), through [JavaSpecialists] newsletter.

Notwithstanding its utility, I was a little disturbed by its name. By and large, the naming in Java has been done considerable effort with focus on affordance. The semantics of the elements used to match quite closely with the names.

This one have too vague a name, and the other I found, asLifoQueue.

Apart from this, a much bigger problem these methods in API pose is the semantic override they provide on the returned interface. In newSetFromMap method a Set interface is returned but is heavily dependent on the underlying Map.

As a general rule of generalization is that one should not assume any specialization, for example, if a reference of type Map has ConcurrentHashMap object, the user should not assume that it is concurrent. The only way to use it concurrently should be to downcast it and then test it as ConcurrentHashMap.

Set<String> names = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>()
The above example creates an issue; how does a user of names verify if the set is concurrent or not. This problem is more than just an academic issue, if the scope of the object is more than a few lines of code, much real issue if this object is passed across methods.

Similarly, java.util.Collections.asLifoQueue returns a Queue Interface. The user of the returned reference cannot infer if the queue is LIFO.

It would have been much better if the API added additional wrapper instead of wrapper factory methods. The semantics of the operations of these collections could be appropriately documented where they could be useful for the consumer of the objects returned from these methods.
For the users, I would recommend NOT to use the methods directly, instead declare classes and use the wrapper methods in those classes.

So, to make a concurrent set use this:
public class ConcurrentSet<E> implements Set<E> {
 private Set<E> underlyingSet;
 public ConcurrentSet(){
  this(new ConcurrentHashMap<E, Boolean>());
 }
 public ConcurrentSet(ConcurrentHashMap<E,Boolean> concurrentHashMap){
  underlyingSet = Collections.newSetFromMap(concurrentHashMap);
 }
 // …
 // Delegate all methods of Set interface to underlyingSet,
 // you can use Eclipse->Source->Generate Delegate Methods.
}
Download Source Code for ConcurrentSet.

Similarly for a FIFOQueue, use this:

public class FIFOQueue<E> implements Queue<E> {
 private Queue<E> underlyingQueue;
 public FIFOQueue(){
  this(new LinkedList<E>());
 }
 public FIFOQueue(Deque<E> deque){
  this.underlyingQueue = Collections.asLifoQueue(deque);
 }
 // …
 // Delegate all methods of Queue interface to underlyingQueue,
 // you can use Eclipse->Source->Generate Delegate Methods.
}

Download Source Code for FIFIQueue.

Remember the best practice is to:Program for other programmers; any dummy can program for the computer.

Comments

Popular posts from this blog

بر بحر "گلس ہنس دیئے نقاب الٹ دی بہار نے"

ماہِ صیام آنکھ کھولی ہے بہار نے
مولا کو جانشین دیا کردگار نے

فاطمہ ہیں خوش علی مسکرا رہے
"گل ہنس دیئے نقاب الٹ دی بہار نے"

ہیں عظمتِ نبی شبیہِ رسول بھی
تحفہ دیا ہے سیدہ پروردگار نے

کیا ہے بارگاہ میں سرخم دست بند
حکمت اور حلم اور کردار نے
صفین کی جنگ میں لپکنے پہ حسن کے
روکا بنسبتِ رسول کرار نے

پیشِ نظر تحفظِ دینِ رسول تھا
قلم کی پیروی جو کی تلوار نے

نامِ علی جو کیا لیا ڈوبتے نے
مشکل سے ہاتھ مارے پھر منجدھار نے
امن میں جو کہ ضبطِ حسن ہو گیا رواں
ضبط کیا جنگ میں علمدار نے
اس پہ ہو معافی سفرؔ کے قلم کی
کی ہے بڑی جرات اس خاکسار نے

نئی ٹیکسی

ابا کا ایک دوست ہے، مقصود۔ ہماری ہی گلی میں ہی رہتا ہے-  اسکے پاس ایک پرانی سوزوکی ٹیکسی ہے ۔ ابا ویسے تو  بس میں آتا جاتا ہے مگر جب کبھی اماں یا ہم کو کہیں لے کے جانا ہو تو مقصود کو ہی کہتا ہے کہ لے چل۔ چونکہ مقصود ابا کا دوست بھی ہے اور اسکے ساتھ تاش بھی کھیلتا ہے، اس لیئے ابا کو کرایہ میں کچھ رعایت دے دیتا ہے۔
مجھے مقصود بالکل بھی اچھا نہیں لگتا، گھور گھور کر دیکھتا رہتا ہے، جب ابا سامنے نہ ہو تو کہتا ہے مجھ سے شادی کرے گا، ویسے تو ابا اس معاملے میں کافی ٹھیک ہے مگر مجھے ڈر ہے کہ کہیں مقصود ابا کو پٹا ہی نہ لے۔ 
 ایک دفعہ میں اسکول سے گھر آرہی تھی کہ دو اوباش لڑکوں نے مجھے دیکھ کر پہلے تو آوازے کسنا شروع کیئے مگر پھر میرا پیچھا شروع کردیا ۔ میں تیز تیز قدموں سے جلدی گھر آجانے کی دعا کرتی تقریبا بھاگنا شروع ہوگئی کہ مجھے مقصود   کی ٹیکسی نظر آگئی۔ وہ سڑک کے کنارے ٹیکسی کھڑی کرکے سواری مل جانے کا انتظار کررہا تھا۔ میں نے آو دیکھا نہ تاو اور جلدی سے دروازہ کھول کر اسکی ٹیکسی میں بیٹھ گئی اور مقصود سے کہا کہ دو لڑکے میرا پیچھا کررہے ہیں تو مجھے گھرپر اتاردو۔ اس نے مجھے غور سے دیکھا پ…

Putting Ideas in the public

I have a gift (or a curse); I can think on many different fronts at the same time, often too many.

One of those fronts is technical / business ideas. There is a ever growing list of ideas that come to my mind. And I want to make use of each of those.

However realizing that I have been not so productive with these ideas. I spend too much time in generating and enhancing these Ideas and contemplating on them and do not focus enough to get through with them to convert them into value. And I know Ideas do not have any value unless they get used.

Lately I have been thinking about this and I thought instead of keeping the ideas to myself in hope that I will get time and focus to implement them why don't I put those Ideas on the web to the public.

This got me thinking....

However, some part of me does not want to let go of the ideas, I see business potentials in many of the these ideas and being a normal person, I wish I could get some benefit out of it. However, I know that stinginess …