回答編集履歴
2
解説修正
    
        answer	
    CHANGED
    
    | 
         @@ -52,9 +52,9 @@ 
     | 
|
| 
       52 
52 
     | 
    
         | 
| 
       53 
53 
     | 
    
         
             
            ループの中では, プロンプトを表示し, 標準入力からの一行( nextLine() )を Gender 型の from メソッドに渡して, Gender 型に変換(もしくは失敗すれば null) しています.
         
     | 
| 
       54 
54 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
            Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )ら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
         
     | 
| 
      
 55 
     | 
    
         
            +
            Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )なら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
         
     | 
| 
       56 
56 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
            Boy や Girl の matches メソッドは, それぞれがパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
         
     | 
| 
      
 57 
     | 
    
         
            +
            Boy や Girl の matches メソッドは, それぞれが予めコンストラクタのパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
         
     | 
| 
       58 
58 
     | 
    
         | 
| 
       59 
59 
     | 
    
         
             
            for 文のループ条件が成立する(ループし続ける)のは, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない"」でした.
         
     | 
| 
       60 
60 
     | 
    
         
             
            変数 gender は初期値 null で, ループしている間に入力によって Boy か Girl に設定されると ```gender == null``` が成立しなくなり, ループを抜けます. 一方, 何回やっても Boy か Girl にならず i がリトライ回数に達すると, gender = null のままでループを抜けます.
         
     | 
1
解説追加
    
        answer	
    CHANGED
    
    | 
         @@ -36,4 +36,26 @@ 
     | 
|
| 
       36 
36 
     | 
    
         
             
                    return gender;
         
     | 
| 
       37 
37 
     | 
    
         
             
                }
         
     | 
| 
       38 
38 
     | 
    
         
             
            }
         
     | 
| 
       39 
     | 
    
         
            -
            ```
         
     | 
| 
      
 39 
     | 
    
         
            +
            ```
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            一応解説など.
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            まず, オリジナルでは変数 gender は String 型でしたが, 代わりとなる Gender 型というのを enum で作りました. ( ```enum Gender { ~ }``` の部分)
         
     | 
| 
      
 44 
     | 
    
         
            +
            String 型の変数であれば ```"男"``` でも ```"Girl"``` でも ```"123"``` でも ```null``` でも入りますが, この Gender 型の変数には ```Gender.Boy```, ```Gender.Girl``` そして ```null``` の3種類しか入りません.
         
     | 
| 
      
 45 
     | 
    
         
            +
            inputGender メソッドが(中でリトライ等ごにょごにょして)最終結果をこの Gender 型で返すということにすることで, リトライ回数以内に正しく性別が入力されたら Boy か Girl, 入力されなかったら null が返る...という仕様に出来, main メソッドではそれによって null で無ければ性別と"確認できました", null だったら "いい加減に~" と表示しています.
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
            さてその inputGender ですが, パラメータとして入力を促すプロンプト文字列("性別を~")とリトライ回数(5)を貰っています. こうすることで, 例えばリトライを 3 回にしよう等の修正の時, 下位のコードを見ること無くこのパラメータを変えるだけで済みます.
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
            変数 gender を用意し, 標準入力から取り込む Scanner も準備します. ( ```try(Scanner scanner = new ~ ) { ~ }``` となっているのは, 一応終了時に scanner を close するためです.)
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
            入力判定・リトライは ```for(int i=0; i<retry && gender==null; i++)``` で行い, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない" ならループする」としています.
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
            ループの中では, プロンプトを表示し, 標準入力からの一行( nextLine() )を Gender 型の from メソッドに渡して, Gender 型に変換(もしくは失敗すれば null) しています.
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            Gender 型の from メソッドは, 渡された一行をまず Boy に "一致するか?" と聞きます( matches メソッド). 一致します( true ) と言われたら Boy を返します. 一致しなかった( false )ら次に Girl に "一致するか?" と聞き, 一致なら Girl を返します. そしてどちらとも一致しなかったら null を返します.
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
            Boy や Girl の matches メソッドは, それぞれがパラメータで渡された正規表現( "男|おとこ|[Bb]oy|BOY"/"女|おんな|[Gg]irl|GIRL" ) と一致するかを返しています.
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
            for 文のループ条件が成立する(ループし続ける)のは, 「"i が(パラメータで受け取った)リトライ回数より小さく" かつ "入力が Gender 型の有効な値( Boy/Girl )に変換出来ていない"」でした.
         
     | 
| 
      
 60 
     | 
    
         
            +
            変数 gender は初期値 null で, ループしている間に入力によって Boy か Girl に設定されると ```gender == null``` が成立しなくなり, ループを抜けます. 一方, 何回やっても Boy か Girl にならず i がリトライ回数に達すると, gender = null のままでループを抜けます.
         
     | 
| 
      
 61 
     | 
    
         
            +
            こうして最後の return は, リトライ以内で Boy/Girl となるか, ならずにリトライを終え null のままの gender を返すことで, 最初の inputGender の仕様通りの結果を返すことになります.
         
     |