An immutable queue does not modify the values of an existing queue, but always recreates the queue and return a new queue.
Check out the Application.java for use cases.
Queue<Integer> queue = new ImmutableQueue.EmptyQueue<Integer>();
queue = queue.enQueue(1);
queue.head();
queue = queue.deQueue();
queue.isEmpty()