先輩に「メソッドを実行して結果を変数に突っ込め」と言われたら2
前回の記事でメソッドを実行して変数に突っ込む時の思考を整理しました
「そんなの出来て当然」と思った方も多いと思いますが、実は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
@Getter
はlombokが提供しているアノテーションで、フィールドにつけると"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などのアノテーションが絡むと状況判断が難しくなる
アノテーションに気をつけて正しい状況判断ができるようになろう