class Bag
{  // ungeordnete Sammlung von Objekten mit Duplikaten

   private Object[] elems; // die Elemente
   private int last;       // Index des letzten Elements
   
   Bag (int capacity)
   { elems = new Object[capcity]; last = -1; }
   
   // Änderungsoperation erfordert gegenseitigen Ausschluss
   synchronized public void add (Object obj)
   {
      last += 1;
      elems[last] = obj;
   }

   // Abfrageoperation besteht nur aus eienr unteilbaren Operation
   // (Auslesen einer Objektvariablen)
   public int getLast() { return last; }
   
   // Abfrageoperation kann während einer Änderungsoperation
   // inkonsistente Ergebenisse liefern, z.B. null
   // daher: gegenseitiger Ausschluss mit Änderungsoperation notwendig
   synchronized public Object get (int idx)
   {  if (idx < 0 || idx > last)
         throw new IndexOutOfBoundsException();
      else return elems[idx];
   }   
}

