回答編集履歴
2
解説修正
test
CHANGED
@@ -106,11 +106,11 @@
|
|
106
106
|
|
107
107
|
|
108
108
|
|
109
|
-
Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )ら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
|
109
|
+
Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )なら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
|
110
110
|
|
111
111
|
|
112
112
|
|
113
|
-
Boy や Girl の matches メソッドは, それぞれがパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
|
113
|
+
Boy や Girl の matches メソッドは, それぞれが予めコンストラクタのパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
|
114
114
|
|
115
115
|
|
116
116
|
|
1
解説追加
test
CHANGED
@@ -75,3 +75,47 @@
|
|
75
75
|
}
|
76
76
|
|
77
77
|
```
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
一応解説など.
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
まず, オリジナルでは変数 gender は String 型でしたが, 代わりとなる Gender 型というのを enum で作りました. ( ```enum Gender { ~ }``` の部分)
|
86
|
+
|
87
|
+
String 型の変数であれば ```"男"``` でも ```"Girl"``` でも ```"123"``` でも ```null``` でも入りますが, この Gender 型の変数には ```Gender.Boy```, ```Gender.Girl``` そして ```null``` の3種類しか入りません.
|
88
|
+
|
89
|
+
inputGender メソッドが(中でリトライ等ごにょごにょして)最終結果をこの Gender 型で返すということにすることで, リトライ回数以内に正しく性別が入力されたら Boy か Girl, 入力されなかったら null が返る...という仕様に出来, main メソッドではそれによって null で無ければ性別と"確認できました", null だったら "いい加減に~" と表示しています.
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
さてその inputGender ですが, パラメータとして入力を促すプロンプト文字列("性別を~")とリトライ回数(5)を貰っています. こうすることで, 例えばリトライを 3 回にしよう等の修正の時, 下位のコードを見ること無くこのパラメータを変えるだけで済みます.
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
変数 gender を用意し, 標準入力から取り込む Scanner も準備します. ( ```try(Scanner scanner = new ~ ) { ~ }``` となっているのは, 一応終了時に scanner を close するためです.)
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
入力判定・リトライは ```for(int i=0; i<retry && gender==null; i++)``` で行い, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない" ならループする」としています.
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
ループの中では, プロンプトを表示し, 標準入力からの一行( nextLine() )を Gender 型の from メソッドに渡して, Gender 型に変換(もしくは失敗すれば null) しています.
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )ら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
Boy や Girl の matches メソッドは, それぞれがパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
for 文のループ条件が成立する(ループし続ける)のは, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない"」でした.
|
118
|
+
|
119
|
+
変数 gender は初期値 null で, ループしている間に入力によって Boy か Girl に設定されると ```gender == null``` が成立しなくなり, ループを抜けます. 一方, 何回やっても Boy か Girl にならず i がリトライ回数に達すると, gender = null のままでループを抜けます.
|
120
|
+
|
121
|
+
こうして最後の return は, リトライ以内で Boy/Girl となるか, ならずにリトライを終え null のままの gender を返すことで, 最初の inputGender の仕様通りの結果を返すことになります.
|