- ベストアンサー
Iteratorパターンの修正方法
- 質問者はIteratorパターンを学習中であり、Mainクラスを実行しても何も表示されない問題が発生している。
- 質問者はStudentListクラスのaddメソッドに問題があると考えている。
- 質問者は他の方法を探しているが具体的な方法がわからない。また、Iteratorパターンを使ってDB接続を汎用的にする方法についても質問している。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
nullチェックは、場合によるので難しいです。 そこら中全部にnullチェックをいれてもコードが読みづらくなりますし。 クラスを使う側がある程度限定されていてわかってるなら、クラスを使う側を含めてテストをちゃんと実施すれば、実際のコードにnullチェックを残す必要はないと思いますし。 nullチェックというか、範囲チェックも含めてStudentクラスのコンストラクタとかは、必要だと思います。nullや、不正な値を渡しても、その時にはエラーが起こらない場合です。(オブジェクトが本来なってはいけない不正な状態にもかかわらず、その時点ではエラーが起きない場合) 後で取り出す場合になってエラーになるとわかりづらいバグになるので。
その他の回答 (4)
- hoge_piyo
- ベストアンサー率57% (15/26)
すいません、前の回答で一箇所間違えました。 public static int MAN = 0; public static int WOMAN = 1; ではなく public static final int MAN = 0; public static final int WOMAN = 1; です。
- hoge_piyo
- ベストアンサー率57% (15/26)
>この場合、性別は最終的にString型にした方がいいのでしょうか? 場合によりますが、メソッドから返すときも、特に理由がなければString型で返す必要はないと思います。もしも、文字としてわかりやすい形で取り出す必要がある場合は、enumの中でtoStringをオーバーライドしておくか、Studentクラスを使う側で変換すればいいですから。 あと、enumでSexを宣言したなら、引数の型をSexにしないとまったく意味が無いです。enumを使用した場合以下のようになります↓ public class Student{ private final String name; private final Sex sex; public Student(String name,Sex sex){ this.name = name; this.sex = sex; } public String getName(){ return name; } public Sex getSex(){ return sex; } } public enum Sex{MAN,WOMAN} あと、intで定数にする場合は、private static finalではなく、public static finalです。privateで は引数で渡せないので意味がありません。たとえばStudentクラスの中で public static int MAN = 0; public static int WOMAN = 1; としておいて、Studentクラスを使う側は new Student("たろう",Student.MAN); というようにして使います。 キャストしてる箇所 ((Aggregate)studentLists).iterator(); とか System.out.println(((Student)itr.next()).getName()); とか
補足
解答ありがとうございます。 大変、助かりました。 エラーチェックを行う場合ですが、 この時のチェックが抜けているというのは、 if(studentLists !=null){} とかといった処理なのでしょうか? よろしくお願いします。
- hoge_piyo
- ベストアンサー率57% (15/26)
省略している部分 一番ひどいのは性別がintで、1か2でそのまま数値で渡しているところでしょうか。明らかにenumにするべきです。 (enumがない古いVersionの時に書かれたものだとしても、せめてpublic static finalで定数としてMANとWOMANを定義しておいて、それを使用するようにするべき。また1か2以外も渡せるようになっていて、チェックしてない) あとはsetterメソッドのnullチェックとか、ジェネリックとか(ジェネリック使ってないからキャストしなければならなくなってる。そして、キャストに失敗した場合のエラー処理も無い) 配列のindexの範囲外にアクセスしてしまう可能性がある。 などでしょうか。 ただ、あくまでも実用的な観点から見た場合ですので、デザインパターンの説明のサンプルとしては、悪くはないとは思います。こういう短いサンプルではそういった(エラー処理などの)省略などはよくあることなので、そういった点を一応気に留めておいて読んだほうがいいです。
補足
解答ありがとうございます。 >明らかにenumにするべきです。。。。 この場合、性別は最終的にString型にした方がいいのでしょうか? 直してみました。 public class Student { private String name; private String sex; private static final int MAN = 1; private static final int WOMAN = 2; public Student(String name, int sex) { this.name = name; //性別 //enumを使う場合 if(sex == 1 ) { this.sex = Sex.MAN.name(); } else if(sex == 2) { this.sex = Sex.WOMAN.name(); } //final定数を使う場合 if(sex == MAN) { this.sex = "MAN"; } else if(sex == WOMAN) { this.sex = "WOMAN"; } } public String getName() { return this.name; } public String getSex() { return this.sex; } } public enum Sex { MAN, WOMAN } > あとはsetterメソッドのnullチェックとか、ジェネリックとか(ジェネリック使ってないからキャストしなければならなくなってる。 そして、キャストに失敗した場合のエラー処理も無い)。。。。 これは、どのクラスの亊なのでしょうか? よろしくお願いします。
- hoge_piyo
- ベストアンサー率57% (15/26)
それで、直してみました。 おそらく、原因は、StudentListクラスのaddメソッドだと思ったのですが、 直したところはあってます。他にもスペルミスがあるし、これを書いた人は実際に実行してないみたいですね・・・ この場合、もっとも汎用性があるソースとはどんなのなのでしょうか? 普通はStudentクラスだけ作って、あとはJavaのクラスを利用するだけで、他のクラスはつくりません。この例だと、それ以外のクラスをつくっても(少なくとも今の機能では)汎用性がなく、殆ど無駄です。 Iteratorパターン自体が、もっと綺麗に実用的に(ジェネリックなども使って)すでにJavaで実装されているので。 あくまでも、Iteratorパターン自体を説明するために、必要最低限のクラスとメソッドを実装したサンプルと思った方がいいです。実用の観点から見ると色々やらなければいけないことを省略している部分が多いです。
補足
解答ありがとうございます。 >実用の観点から見ると色々やらなければいけないことを省略している部分が多いです。 例えば、どういった部分なのでしょうか? よろしくお願いします。
お礼
解答ありがとうございます。 でしたら、nullに関して、ソースをまた作り変えてから新たに質問させてもらいます。 また、よろしくお願いします。 ながなが、とありがとうございました。