1
0

More than 3 years have passed since last update.

セミコロンレスって new FizzBuzz().say(0).say(1).say(2).say(3).say(4)... のことだと思ってた

Last updated at Posted at 2020-03-13

解決 new FizzBuzz().say(0).say(1).say(2).say(3).say(4)は「メソッドチェーン」というのだ!

shiracamus様に教えていただきました。ありがとうございます。


javaのjの字も知らなかった2、3年前のことですが、
「セミコロンレスjava」といって、セミコロンなしでFizzBuzzをやってみたりするコードがネットで公開されてました。

printやprintlnは戻り値なしだけどprintfは何故かPrintStreamを返してくれる。だからnullと比較できる
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文をめちゃくちゃ長くするようなのをセミコロンレスというのだと勘違いしていました。

new_FizzBuzz().say(0).say(1).say(2)...
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様、ご指摘ありがとうございます)

1
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0