成果がよくないことがあるのですが…
これもその一例…
でも、意外とやってみて使えそうな気がしたのでメモです。
Javaの
enum
は何気にInterface
の実装を記述することができて、switch - case
文でやっていることをそのままenumにさせることが可能だったりする。以下は
switch
文を使った例
public enum Fruit {
APPLE, ORANGE
}
public class DisplayFruit {
public void printFruitName(Fruit fruit){
switch(fruit){
case APPLE:
System.out.println("This is an apple.");
break;
case ORANGE:
System.out.println("This is an orange.");
break;
}
}
}
この
DisplayFruit
クラスのユーザーはprintFruitName
メソッドにenum Fruit
を引数として渡して、その結果としてそれぞれのフルーツの名前が表示される。
という仕様になっているわけですが、
これまたテストするのが面倒くさいなと思うわけですよ。
テストケースは二つで、
Fruit
がAPPLE
だった場合、This is an apple.
と表示されること。Fruit
がORANGE
だった場合、This is an orange.
と表示されること。
これって、どうやんの?と思う。
いや、すくなくともオレだけは。
というわけで、
Javaの
enum
は何気にInterface
の実装を記述することができるを活用してみる。
まずはインターフェース。
public interface FruitName {
public String getName();
}
で、次にenum。
public enum Fruit implements FruitName {
APPLE{
@Override
public String getName(){
return "This is an apple";
}
},
ORANGE{
@Override
public String getName(){
return "This is an orange";
}
}
}
こうすると、
DisplayFruit
はこんなになる。
public class DisplayFruit {
public void printFruitName(Fruit fruit){
System.out.println(fruit.getName());
}
}
これで
DisplayFruit
のテストはほぼ無くなる。で、最後にテストをする余地があるとしたら、それは
DisplayFruit
に対してのテストではなく、Fruit
に対するテストだけになる。テストコードはこんな感じです。
public class FruitTest{
@Test
public void testGetName(){
assertThat(Fruit.APPLE.getName(), is("This is an apple."));
assertThat(Fruit.APPLE.getName(), is("This is an orange."));
}
}
ただし、どっちのほうが性能が良いんだ?とかいう野暮な質問はオレにはしないでくれよ。
…答えられない人ノ
0 件のコメント:
コメントを投稿