Skip to main content

The real story about how Anakin Skywalker became Darth Vader

Posted by kirillcool on May 28, 2005 at 1:54 PM PDT

Here it is - the JDK 5.0-compliant story behind "Revenge of the Sith". See it in all its glory, using the new java.util.concurrency package:

public class Princess implements ExecutorService {
   public static final Princess PADME = new Princess();

   // private member
   private StarShip ship;

   private Princess() {
     this.setDefaultLocale(Locale.EN);
     Timer timer = new Timer();
     TimerTask task = new TimerTask() {
       public void run() {
         Princess.this.changeHairStyle();
         Princess.this.changeClothes();
       }
     };
     timer.scheduleAtFixedRate(task, new Date(), 1000);
   }
}

public class JediKnight implements ExecutorService {
   public static final JediKnight ANAKIN = new JediKnight(false);
   public static final JediKnight OBI_WAN = new JediKnight(false);
   public static final JediKnight YODA = new JediKnight(true);

   private JediKnight(boolean isYoda) {
     if (!isYoda) {
       this.setDefaultLocale(Locale.EN);
     }
     else {
       Locale yodaLocale = Locale.EN;
       this.setDefaultLocale(Utils.shuffle(yodaLocale));
     }
     this.setLightSabre(LightSabreFactory.getInstance());
     this.setGoodLooking(!isYoda);
   }
}

public class Sith {
   public static final Sith LORD = new Sith();

   private Sith() {
     this.setDefaultLocale(Locale.EN);
     this.setClothes(DarkRobeFactory.getInstance());
     this.setLightSabre(LightSabreFactory.getInstance());
   }
}

public static main() {
  // The following line has been commented out so as not
  // to confuse fans who never did it
 
  // Utils.initChildren(JediKnight.ANAKIN, Princess.PADME);

  // Use JDK 5.0 concurrency package
  Future<Set<Child>> padmeFuture = Princess.PADME.submit(
    new Callable<Set<Child>>() {
      public Set<Child> call() {
        try {
          int weeks = (int)(36+4.0*Math.random());
  wait(weeks*7*24*60*60*1000);
          this = null;
          System.gc();
        }
        finally() {
          Child boy = new Child("Luke");
          Child girl = new Child("Leia");
          Set<Child> result = new HashSet<Child>();
          result.add(boy);
          result.add(girl);
          return result;
        }
      }
    }
  );

  if (JediKnight.ANAKIN.poll(padmeFuture) instanceof ThreadDeath) {
    JediKnight.ANAKIN.alarm();

    // use some marketing ideas
    Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("object.restore.afterGC"));
    Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.power.dark.*"));
    Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.power.*"));
    Sith.LORD.promise(JediKnight.ANAKIN, new RuntimePermission("force.*"));

    JediKnight.ANAKIN.setInternalName("Darth Vader");

    JediKnight.ANAKIN.promise(Princess.PADME, new RuntimePermission("*"));

    Princess.PADME.alarm();
    Princess.PADME.boardShip();

    // Use JDK 5.0 concurrency package
    Future<StarShip> anakinFuture =
      JediKnight.OBI_WAN.submit(
        new Callable<StarShip>() {
          public RuntimePermission call() {
            try {
              Class princessClass = Princess.getClass();
              Field shipField = princessClass.getDeclaredField("ship");
              // will never throw SecurityException on Jedi Knight
              shipField.setAccessible(true);
              JediKnight.this.add(new RuntimePermission("object.ship.board.*"));
              return (StarShip)shipField.get(Princess.PADME);
            }
            catch (SecurityException se) {
              // never supposed to happen to Jedi Knight
              System.out.println("Internal error. Contact George Lucas.");
              System.reboot();
            }
          }
        }
      );

    StarShip padmeShip = anakinFuture.call();
    padmeShip.put(JediKnight.OBI_WAN);

    JediKnight.ANAKIN.see(Princess.PADME);
    Princess.PADME.removeLove(JediKnight.ANAKIN);

    JediKnight.ANAKIN.see(JediKnight.OBI_WAN);
    JediKnight.ANAKIN.removeLove(Princess.PADME);
   
    JediKnight.OBI_WAN.removeLimbs(JediKnight.ANAKIN);
    // note - absolutely no need for GC, Anakin will be collected automatically.

    ReferenceQueue<JediKnight> sithWatchList = new ReferenceQueue<JediKnight>();
    PhantomReference<JediKnight> anakinRef = sithWatchList.remove();
    JediKnight anakinPhantom = anakinRef.get();

    Sith DARTH_VADER = Sith.LORD.assemble(anakinPhantom, LimbFactory.getSpareInstances());
    MouthPiece newMouthPiece = MouthPieceFactory.getInstance();
    // no need to check that it works - guaranteed to work with no noise
    DARTH_VADER.add(newMouthPiece);
    DARTH_VADER.rise();
  }
  else {
    // TODO - create alternative scenario for Sith revenge
  }
}