Javaでパターンマッチをやってみた

深淵からの呼び声
今日は昼寝をしていたら、謎の声が天から聞こえてきました。
Javaでtry-catchをパターンマッチに使うとか恐ろしいことが聞こえてきた…
— numa (@numa08) 2013, 11月 19
きっとこれは、深淵からの呼び声だと思います。なので、ちょっとコードを書いてみました。
まずはScala
Scalaで書くとこうなります。普通ですね。
abstract class Name case class FirstName(name:String) extends Name case class LastName(name:String) extends Name def printName(name : Name) :Unit = { name match { case FirstName(name) => println(name) case LastName(name) => println(name.toUpperCase) case _ => {} } } printName(FirstName("numa")) //numa printName(LastName("numa08")) //NUMA08
case classによるパターンマッチ、Akka使うときに結構活躍します。
悲しみあふれるJava
Javaだとこうですかね
public static abstract class Name extends Exception{}
public static class FirstName extends Name {
private final String name;
public FirstName(String name) {
super();
this.name = name;
}
public String name() {
return name;
}
}
public static class LastName extends Name {
private final String name;
public LastName(String name) {
super();
this.name = name;
}
public String name() {
return name;
}
}
public static void printName(Name name) {
try {
throw(name);
}catch (FirstName n) {
System.out.println(n.name());
}catch (LastName n) {
System.out.println(n.name().toUpperCase());
} catch (Name e) {
e.printStackTrace();
}
}
public static void invoke() {
printName(new FirstName("numa")); //numa
printName(new LastName("numa08")); //NUMA08
}
こんなことして、一体だれが得するっていうんですか!!おとなしくinstanceof使ってくださいよ!!
あるいは、ちゃんとポリモーフィズムを考えてくださいよ!!!
出番としては?何だろ、Exceptionを継承している時点で存在しないんじゃないですかね?