Example
Home ] Up ] [ Example ] Running the Example ]

 

 

So, I changed the Enumerator class to make it a non-static member class of Stack.  This allowed me to:

  • Remove the explicit passing of a reference to the Stack instance in the Enumerator's constructor.  In fact, I eliminated the constructor entirely, since the default constructor is all I need!
  • I removed Enumerator's m_theStack field.  I no longer need it, because I have an automatically generated implicit reference to the appropriate instance of the enclosing Stack class.
  • I eliminated all the references to m_theStack, and replaced them with direct calls to the appropriate Stack methods from within the Enumerator class.

Here's what the new Stack class looks like with a shiny new Enumerator member class:

package memberClasses;
import java.util.Enumeration;
/**
 * Stack implements a simple stack of integers
 */
public class Stack
{
  /**
   * Creates a stack of specified number of elements
   */
  public Stack(int size)
  {
    m_stackData = new int[size];
  }
  /**
   * Pushes an integer value on the stack,
   * or throws an exception, if insufficient space
   */
  public void push(int value) throws IllegalStateException
  {
    if (m_next >= m_stackData.length)
      throw new IllegalStateException("Stack full");
    m_stackData[m_next++] = value;
  }
  /**
   * Returns whether the stack is currently empty
   */
  public boolean isEmpty()
  {
    return (m_next == 0);
  }
  /**
   * Pops the top int value off the stack,
   * or throws an exception if the stack is empty
   */
  public int pop() throws IllegalStateException
  {
    if (isEmpty())
      throw new IllegalStateException("Stack empty");
    return m_stackData[--m_next]; // top item on stack
  }
  /**
   * Returns the current size of the stack
   */
  public int getStackSize()
  {
    return m_next;
  }
  /**
   * Returns the maximum size of the stack
   */
  public int getMaxStackSize()
  {
    return m_stackData.length;
  }
  /**
   * Return the value of the specified item in the stack
   * or throws an exception if the index specified is invalid.
   */
  private int get(int index) throws IllegalArgumentException
  {
    if (index < 0 || index >= getStackSize())
      throw new IllegalArgumentException("index = " + index);
    return m_stackData[index];
  }
  /**
   * Returns an instance of the Enumerator class to the caller
   * as an Enumeration.  This is known as an "opaque" class.
   * All the caller needs to know is that the class being returned
   * implements the Enumeration interface.
   */
  public Enumeration getEnumerator()
  {
    return new Enumerator();
  }
  private int[] m_stackData;
  private int   m_next = 0; // Index of last item in stack
  /**
   * A member class to iterate through an instance of this Stack
   */
  private class Enumerator implements Enumeration
  {
    /**
     * Returns whether there are more elements
     */
    public boolean hasMoreElements()
    {
      return m_current < getStackSize() - 1;
    }
    /**
     * Returns the next element
     */
    public Object nextElement()
    {
      return get(++m_current);
    }
    private int m_current = -1; // Position "before" first stack element
  }
}
 

This page was last modified on 02 October, 2007