"What I can not create, I do not understand."
- Richard Feynman
Although Java is not so much my forte, I have spent some portion of my professional career working on it, and I must say that it has evolved to be quite a nice language to program with compared to it's early days. Now it's got a complete memory model, and many nice advanced data structures such as lock-free concurrent queues... etc. Some of my ramblings and experiments below as usual.
Multiple Dispatch
Since the language doesn't support it natively, we have all seen clever tricks to make Java do Double Dispatch. I was warned that anything more than Double will quickly go unweildy, but well here it is for me to see myself.
|
abstract class Vehicle
{
void collide(Vehicle a, Vehicle b){ System.out.println("Unspecified collision"); }
void collideCarDash(Car a, Vehicle b){ System.out.println("Unspecified collision"); }
void collideCarCar(Car a, Car b){ System.out.println("Unspecified collision"); }
void collideCarBike(Car a, Bike b){ System.out.println("Unspecified collision"); }
void collideCarBus(Car a, Bus b){ System.out.println("Unspecified collision"); }
void collideBikeDash(Bike a, Vehicle b){ System.out.println("Unspecified collision"); }
void collideBikeCar(Bike a, Car b){ System.out.println("Unspecified collision"); }
void collideBikeBike(Bike a, Bike b){ System.out.println("Unspecified collision"); }
void collideBikeBus(Bike a, Bus b){ System.out.println("Unspecified collision"); }
void collideBusDash(Bus a, Vehicle b){ System.out.println("Unspecified collision"); }
void collideBusCar(Bus a, Car b){ System.out.println("Unspecified collision"); }
void collideBusBus(Bus a, Bus b){ System.out.println("Unspecified collision"); }
void collideBusBike(Bus a, Bike b){ System.out.println("Unspecified collision"); }
};
class Car extends Vehicle
{
void collide(Vehicle a, Vehicle b) { a.collideCarDash(this, b); }
void collideCarDash(Car a, Vehicle b) { b.collideCarCar(this, a); }
void collideBikeDash(Bike a, Vehicle b) { b.collideCarBike(this, a); }
void collideBusDash(Bus a, Vehicle b) { b.collideCarBus(this, a); }
void collideCarCar(Car a, Car b) { System.out.println("Car hits Car and Car"); }
void collideCarBus(Car a, Bus b) { System.out.println("Car hits Car and Bus"); }
void collideCarBike(Car a, Bike b) { System.out.println("Car hits Car and Bike"); }
void collideBikeBike(Bike a, Bike b) { System.out.println("Car hits Bike and Bike"); }
void collideBikeCar(Bike a, Car b) { System.out.println("Car hits Bike and Car"); }
void collideBikeBus(Bike a, Bus b) { System.out.println("Car hits Bike and Bus"); }
void collideBusBus(Bus a, Bus b) { System.out.println("Car hits Bus and Bus"); }
void collideBusCar(Bus a, Car b) { System.out.println("Car hits Bus and Car"); }
void collideBusBike(Bus a, Bike b) { System.out.println("Car hits Bus and Bike"); }
}
class Bike extends Vehicle
{
void collide(Vehicle a, Vehicle b) { a.collideBikeDash(this, b); }
void collideCarDash(Car a, Vehicle b) { b.collideBikeCar(this, a); }
void collideBikeDash(Bike a, Vehicle b) { b.collideBikeBike(this, a); }
void collideBusDash(Bus a, Vehicle b) { b.collideBikeBus(this, a); }
void collideCarCar(Car a, Car b) { System.out.println("Bike hits Car and Car"); }
void collideCarBus(Car a, Bus b) { System.out.println("Bike hits Car and Bus"); }
void collideCarBike(Car a, Bike b) { System.out.println("Bike hits Car and Bike"); }
void collideBikeBike(Bike a, Bike b) { System.out.println("Bike hits Bike and Bike"); }
void collideBikeCar(Bike a, Car b) { System.out.println("Bike hits Bike and Car"); }
void collideBikeBus(Bike a, Bus b) { System.out.println("Bike hits Bike and Bus"); }
void collideBusBus(Bus a, Bus b) { System.out.println("Bike hits Bus and Bus"); }
void collideBusCar(Bus a, Car b) { System.out.println("Bike hits Bus and Car"); }
void collideBusBike(Bus a, Bike b) { System.out.println("Bike hits Bus and Bike"); }
}
class Bus extends Vehicle
{
void collide(Vehicle a, Vehicle b) { a.collideBusDash(this, b); }
void collideCarDash(Car a, Vehicle b) { b.collideBusCar(this, a); }
void collideBikeDash(Bike a, Vehicle b) { b.collideBusBike(this, a); }
void collideBusDash(Bus a, Vehicle b) { b.collideBusBus(this, a); }
void collideCarCar(Car a, Car b) { System.out.println("Bus hits Car and Car"); }
void collideCarBus(Car a, Bus b) { System.out.println("Bus hits Car and Bus"); }
void collideCarBike(Car a, Bike b) { System.out.println("Bus hits Car and Bike"); }
void collideBikeBike(Bike a, Bike b) { System.out.println("Bus hits Bike and Bike"); }
void collideBikeCar(Bike a, Car b) { System.out.println("Bus hits Bike and Car"); }
void collideBikeBus(Bike a, Bus b) { System.out.println("Bus hits Bike and Bus"); }
void collideBusBus(Bus a, Bus b) { System.out.println("Bus hits Bus and Bus"); }
void collideBusCar(Bus a, Car b) { System.out.println("Bus hits Bus and Car"); }
void collideBusBike(Bus a, Bike b) { System.out.println("Bus hits Bus and Bike"); }
}
public class
/**
* @param args
*/
public static void main(String[] args) {
Vehicle a = new Car();
Vehicle b = new Bike();
Vehicle c = new Bus();
a.collide(a, a);
a.collide(a, b);
a.collide(a, c);
a.collide(b, a);
a.collide(b, b);
a.collide(b, c);
a.collide(c, a);
a.collide(c, b);
a.collide(c, c);
b.collide(a, a);
b.collide(a, b);
b.collide(a, c);
b.collide(b, a);
b.collide(b, b);
b.collide(b, c);
b.collide(c, a);
b.collide(c, b);
b.collide(c, c);
c.collide(a, a);
c.collide(a, b);
c.collide(a, c);
c.collide(b, a);
c.collide(b, b);
c.collide(b, c);
c.collide(c, a);
c.collide(c, b);
c.collide(c, c);
} |
Car hits Car and Car
Bike hits Car and Car
Bus hits Car and Car
Car hits Bike and Car
Bike hits Bike and Car
Bus hits Bike and Car
Car hits Bus and Car
Bike hits Bus and Car
Bus hits Bus and Car
Car hits Car and Bike
Bike hits Car and Bike
Bus hits Car and Bike
Car hits Bike and Bike
Bike hits Bike and Bike
Bus hits Bike and Bike
Car hits Bus and Bike
Bike hits Bus and Bike
Bus hits Bus and Bike
Car hits Car and Bus
Bike hits Car and Bus
Bus hits Car and Bus
Car hits Bike and Bus
Bike hits Bike and Bus
Bus hits Bike and Bus
Car hits Bus and Bus
Bike hits Bus and Bus
Bus hits Bus and Bus
As promised, it works but it's damn messy :)