/*******************************************************************************/ abstract class Scene { abstract void draw(); abstract void update(); } Hashtable scenes = new Hashtable(); Scene getScene(String s) { try { return getScene(Class.forName(getClass().getName()+'$'+s+"Scene")); } catch (ClassNotFoundException ex) { ex.printStackTrace(); return null; } } Scene getScene(Class clazz) { Object o = scenes.get(clazz); if (o!=null) return (Scene)o; try { // instantiate the inner class o = clazz.getConstructor(new Class[]{getClass()}).newInstance(new Object[]{this}); } catch (Exception ex) { ex.printStackTrace(); } scenes.put(clazz,o); return (Scene)o; }