SSS(G) ML の話題から
「小さい月(2,4,6,9,11)を判定する式をJavaではどう表現するか」という問題があり、それについて考えてみた。
これでいいと思うが、オブジェクト指向ではこれを判定するクラスを考えることから設計が始まる…
小さい月かどうかを判定するクラスを考えてみると、次のようになるだろう。ユーティリティクラスになるので、Singleton パターンを適用してみた。月を指定するには、やはりCalendarクラスの定数を使用するべきだ。
public class ThirtyDaysMonthSet {
private static final Set set = new HashSet();
private static final ThirtyDaysMonthSet instance = new ThirtyDaysMonthSet();
public static ThirtyDaysMonthSet getInstance() {
return instance;
}
private ThirtyDaysMonthSet() {
set.add(new Integer(Calendar.FEBRUARY));
set.add(new Integer(Calendar.APRIL));
set.add(new Integer(Calendar.JUNE));
set.add(new Integer(Calendar.SEPTEMBER));
set.add(new Integer(Calendar.NOVEMBER));
}
public boolean contains(int month) {
return set.contains(new Integer(month));
}
public static void main(String[] args) {
ThirtyDaysMonthSet set = ThirtyDaysMonthSet.getInstance();
System.out.println(“FEBRUARY : ” + set.contains(Calendar.FEBRUARY));
System.out.println(“MARCH : ” + set.contains(Calendar.MARCH));
System.out.println(“3 : ” + set.contains(3));
}
}
もう一つの方法も考えてみた。2,4,6,9,11という数の集合という捉え方をして、便利なコンストラクタと便利なcontainsメソッドを持つユーティリティクラスとして用意する方法だ。正確にはaddなどで、数しかうけとらないようにしないといけないが、手を抜いてやっていない。Tigerのgenericを使えば、もっときちんとしたNumberSetクラスを簡単に定義できるはずだ。
public class NumberSet extends HashSet {
public NumberSet(int[] numbers) {
for (int i=0 ; i<numbers.length ; i++) {
add(new Integer(numbers[i]));
}
}
public boolean contains(int number) {
return contains(new Integer(number));
}
public static void main(String[] args) {
//int[] numbers = {2, 4, 6, 9, 11};
//NumberSet set = new NumberSet(numbers);
NumberSet set = new NumberSet(new int[]{2, 4, 6, 9, 11});
System.out.println(“2 : ” + set.contains(2));
System.out.println(“3 : ” + set.contains(3));
}
}
このクラスがあれば、(new NumberSet(new int[]{2, 4, 6, 9, 11})).contains(x) といった表現もできて、==, || を使った式よりもxが何度もでてこなくてきれいな感じはする。でも、長い…