Language Basics Java

//package gameEngine.logic.utils;
import java.lang.reflect.Array;
import java.util.Random;
public class Shuffler
{
  private T m_Array[] = null;
  private int m_Index = 0;
  
  @SuppressWarnings("unchecked")
  public Shuffler(int size, int quantitiesArr[], Class type) 
  {
    m_Array = (T[])Array.newInstance(type, size);
    int startIndex = 0;
    for (T currValue : type.getEnumConstants()) 
    {
      int currIndex = currValue.ordinal();
      if (currIndex >= quantitiesArr.length)
      {
        break;
      }
      if (quantitiesArr[currIndex] == 0)
      {
        continue;
      }
      initElements(startIndex, quantitiesArr[currIndex], currValue);
      startIndex += quantitiesArr[currIndex];
    }
    Randomizer.generatePermutationOnArray(m_Array);
  }
  
  private void initElements(
          int startingIndex, 
          int numberOfElements, 
          T elemValue
          ) 
  {
    for (int i = 0; i < numberOfElements; i++)
    {
      m_Array[i + startingIndex] = elemValue;
    }
  }
  public void shuffle()
  {
    if (m_Array != null)
    {
      Randomizer.generatePermutationOnArray(m_Array);
    }
    reset();
  }
  
  public void reset()
  {
    m_Index = 0;
  }
  
  public T getNext()
  {
    try
    {
      return m_Array[m_Index++];
    }
    catch(ArrayIndexOutOfBoundsException e)
    {
      return null;
    }
  }
  
  public T peek()
  {
    if (m_Index >= m_Array.length)
    {
      return null;
    }
    else
    {
      return m_Array[m_Index];
    }
  }
}
class Randomizer
{
  static
  {
    m_Random = new Random();
  }
  
  public static void generatePermutationOnArray(Object[] array)
  {
    Object tmp = null;
    int currIndex = 0;
    for (int i = array.length; i > 0; i--)
    {
      currIndex = m_Random.nextInt(i);
      tmp = array[currIndex];
      array[currIndex] = array[i - 1];
      array[i - 1] = tmp;
    }
  }
  
  public static int getRandomNumber(int lowerBound, int higherBound)
  {
    int delta = higherBound - lowerBound + 1;
    return (m_Random.nextInt(delta) + lowerBound);
  }
  
  private static Random m_Random;
  
  public static void main(String args[])
  {
    Integer arr[] = new Integer[20];
    for (int i = 0; i < 20; i++)
    {
      arr[i] = new Integer(i);
    }
    for (int i = 0; i < 5; i++)
    {
      System.out.println("");
      generatePermutationOnArray(arr);
      
    }
  }
  public static double getRandomDouble()
  {
    double rand = m_Random.nextDouble();
    boolean flag = m_Random.nextBoolean();
    if (flag == true)
    {
      rand *= -1.0;
    }
    return rand;
  }
}