さて、esper 氏の意見を採用して、イミュータブルなFraction クラスのprivate 変数にfinal をつけて実装を進めることにします。
とりあえず、multiply をその方針に従って書き直しました。
public Fraction multiply(long dst){ if(dst == 0)return ZERO; if(isZero() || isInfinity() || dst == 1)return this; long tempNumerator = numerator; long tempDenominator = denominator; if(dst < 0 && tempNumerator < 0){ dst = Math.abs(dst); tempNumerator = Math.abs(tempNumerator); }else if(dst < 0 && tempDenominator < 0){ dst = Math.abs(dst); tempDenominator = Math.abs(tempDenominator); } if(tempDenominator % dst == 0){ tempDenominator = tempDenominator / dst; }else{ tempNumerator = tempNumerator * dst; } return new Fraction(tempNumerator, tempDenominator); }
まあ、あまり変わらないといえば変わらないですし、可読性もそれほど犠牲になっているわけでもないような気がしますので、オッケーかなと。
では次に、割り算の方を実装してみます。
こんな感じになるかなぁ?
→ソースコード
public Fraction divide(long dst){ if(dst == 0)return INFINITY; if(isZero() || isInfinity() || dst == 1)return this; long tempNumerator = numerator; long tempDenominator = denominator; if(dst < 0 && tempNumerator < 0){ dst = Math.abs(dst); tempNumerator = Math.abs(tempNumerator); }else if(dst < 0 && tempDenominator < 0){ dst = Math.abs(dst); tempDenominator = Math.abs(tempDenominator); } if(tempNumerator % dst == 0){ tempNumerator = tempNumerator / dst; }else{ tempDenominator = tempDenominator * dst; } return new Fraction(tempNumerator, tempDenominator); }
掛け算と違うのは、まあ色々ありますが細かい事はソースコードを見比べて頂くということで。
さて、これを実際に実行してみましょう。
→ソースコード
{ //3 で割ってみる Fraction result = fraction.divide(3); print(result); } { //-2 で割ってみる Fraction result = fraction.divide(-2); print(result); } { //0 で割ってみる Fraction result = fraction.divide(0); print(result); }
上記の実行結果は以下のようになります。
result: 1/6 [false, false] result: 1/-4 [false, false] result: 1/0 [false, true]
ちゃんとできているようですね。