解決 new FizzBuzz().say(0).say(1).say(2).say(3).say(4)は「メソッドチェーン」というのだ!
shiracamus様に教えていただきました。ありがとうございます。
javaのjの字も知らなかった2、3年前のことですが、
「セミコロンレスjava」といって、セミコロンなしでFizzBuzzをやってみたりするコードがネットで公開されてました。
public class SemicolonLessFizzBuzz
{
SemicolonLessFizzBuzz(int j)
{
for(int i : new int[] {j})
if(System.out.printf("%d", i)!=null)
{
if(i%3==0)
if(System.out.printf("fizz")!=null)
{}else{}
if(i%5==0)
if(System.out.printf("buzz")!=null)
{}else{}
if(System.out.printf("\n")!=null){}
if(new SemicolonLessFizzBuzz(j+1)!=null){}
}
}
public static void main(String[] args)
{
for(int i : new int[] {0})
if(new SemicolonLessFizzBuzz(i) != null){}
}
}
こんな感じのとか、stream呼ぶのとかリファクタリングで無理やりセミコロンなしでクラス呼ぶのもあったなあ
当時の自分は全く理解できなかったのですが、最近になって
「return this
なメソッドばかりのクラスってセミコロンなしで自在に呼び出せるんじゃね?」
とか思いました。
要は
say(int i)
メソッドにi
が3や5で割り切れるかを言わせ、さらにreturn this
すれば
new FizzBuzz().say(0).say(1).say(2)...
を呼ぶことでfizzbuzzができるんじゃないかと。
実はこの記事を書くまで、return this
するメソッドによって1文をめちゃくちゃ長くするようなのをセミコロンレスというのだと勘違いしていました。
public class FizzBuzz
{
public static void main(String[] args)
{
if
(
new FizzBuzz()
.say(0).say(1).say(2)
.say(3).say(4).say(5)
.say(6).say(7).say(8)
.say(9).say(10).say(11)
.say(12).say(13).say(14)
.say(15)
!= null
) {}
}
FizzBuzz say(int j)
{
for(int i : new int[] {j})
if(System.out.printf("%d", i)!=null)
{
if(i%3==0)
if(System.out.printf("fizz")!=null)
{}else{}
if(i%5==0)
if(System.out.printf("buzz")!=null)
{}else{}
if(System.out.printf("\n")!=null){}
}
return this;//ここだけセミコロンがでてしまう。。。
}
}
こういう書き方って何て呼ぶんでしょうか?
ご存じの方コメント欄で教えてください!→コメント欄で教えてもらいました。「メソッドチェーン」といいます。
new FizzBuzz().say(0).say(1).say(2).say(3).say(4)... のメリット
HTML5のCanvasに図形を書くためのクラスとか、phpでGDやらImageMagicを使うときとか、そういうときに役立ちます。
例えば丸書く()
メソッド、ちょん()
メソッド、おまめ()
メソッドなどが定義されたクラスを使ってドラえもんを描画する場合、
if(
doraemon = new CanvasWriter()
.丸書く().ちょん().丸書く().ちょん() //丸書いてちょん、丸書いてちょん、
.おまめ().根().植木鉢().植木鉢() //おまめに根が出て植木鉢、植木鉢
.date("2020/6/6").UFO() //6月6日にUFOが
.gothrough().gothrough().fall_down().お池(2)//あっち行ってこっち行って落っこちてお池が二つできました
.浮かべる(new 船()).三日月() //お池にお船を浮かべたらお空に三日月のぼってた
.ひげ() //ひげを付けたらドラえもん
!=null){}
これで「セミコロンレスドラえもん」を描画できます。
メソッド名の工夫次第で可読性が大きく向上するのではないでしょうか。
(追記:fujitanozomu様、ご指摘ありがとうございます)