先輩に「メソッドを実行して結果を変数に突っ込め」と言われたら2

前回の記事でメソッドを実行して変数に突っ込む時の思考を整理しました

naosim.hatenablog.jp

「そんなの出来て当然」と思った方も多いと思いますが、実はjavaはそんなに甘くないです
ってことで抜き打ちテスト!

以下の問いに答えよ

1. hogeメソッドを実行して変数に突っ込め

class Hoge {
public int hoge(String text) { /* 実装省略 */ }
}

2. hogeメソッドを実行して変数に突っ込め

class Hoge {
  public static int hoge(String text) { /* 実装省略 */ }
}

3. valueを取得して変数に突っ込め

class Hoge {
  @Getter
  private final String value;
  public String getDoubleValue() { return value + value; }
}

4. hogeメソッドを実行して変数に突っ込め

@Component
class Hoge {
public int hoge(String text) { /* 実装省略 */ }
}

5. invokeメソッドを実行して変数に突っ込め

※これはひっかけ問題です

@RestController
class Hoge {
  @RequestMapping(value = "/hello", method = RequestMethod.POST)
  public Map invoke() { /* 実装省略 */ }
}

解答

1

int hoge = new Hoge().hoge("あいうえお");

インスタンスに対してメソッドを呼べばOK

2

int hoge = Hoge.hoge("あいうえお");

クラスに対してメソッドを呼べばOK

3

ここからが本題
@Getterに注目できればOK @Getterlombokが提供しているアノテーションで、フィールドにつけると"getフィールド名()"の形式のメソッドを自動生成してくれる
今回の場合はvalueアノテーションが付いているのでgetValue()が生成されている
なので正解はこう

String value = new Hoge("あいうえお").getValue();

こんな感じでアノテーションが目に見えないメソッドを生成していることがある
アノテーションの意味を理解しよう
ちなみに今回の問題は@Getterを理解してないと
「問題はvalueを取れって言ってるけどprivateだから取れない。。お?getDoubleValue()てメソッドがあるぞ。とりあえずこれ使っとこと」

String value = new Hoge("あいうえお").getDoubleValue();

みたいなな違いが起きる
これはアノテーションを理解していない場合に現場でありがちな勘違い
気をつけよう

4

@Componentに注目できればOK
@Componentの場合はDIが絡んでいるのでインスタンス生成に@Autowiredを用いる
なのでどこかで生成してからメソッドを呼べばok

@Autowired
Hoge hoge;
int hoge = hoge.hoge("あいうえお");

ちなみに@Autowiredしてから使う系は @Componentの他にも@Service@Repositoryなどがある
いちおう文法上は普通にnewしても使えるけど、たぶんチームメンバーに怒られる

5

これはもはやRestApiなので普通にnewして呼ぶものじゃない
curlコマンドで呼ぶとか、webClient的なもので呼ぶとか、テストツールで呼ぶとか

まとめ

「メソッドを実行して結果を変数に突っ込め」と言われた時、その実現方法は状況に応じていろいろあることがわかった
とくにlombokやDIなどのアノテーションが絡むと状況判断が難しくなる
アノテーションに気をつけて正しい状況判断ができるようになろう