インスタンス生成メソッド
本日はコードの可読性を向上するアイディアを学んだので備忘録とします。
課題のとあるクラスで自分自身のインスタンスを作成して戻り値にするメソッドがあり、首を傾げたのでメンターさんに質問しました。
わざわざインスタンスをnewするなら使用するときにnewしてしまえばいいじゃない?と思ったからです。
結論として、このメソッドの作成目的は「ソースコードの可読性の向上」でした。
例えばクラスAとクラスBがあり、クラスAでクラスBのメソッドを使用するとします。
public class B{
public static B getInstance(){ //戻り値の型B
return new B(); //Bをnewして返す
}
public hoge(){
何らかの処理
}
}
public class A{
public static void main(String[] args){
B.getInstance().hoge(); //newとメソッド実行を1行に記述
}
}
Bクラスのhoge()を使用するためには本来こう記述します。
B b = new B();
b.hoge();
2行になりました。
短い記述ですが確かに1行の方が即座にBクラスのメソッドだと分かるしスマートです。他人が書いていたらgetInstanceメソッドの内容を確認しに行かなければなりませんが、メソッド名である程度予想できるし最低でも詳細設計書を見ればわかるのではないでしょうか。
それに本来はクラスBのhogeメソッドを使うためにインスタンスを作らなければいけませんが、staticなgetInstance()ならさっと呼んでついでにhoge()…という具合です。(※new B().hoge();でも実行できるのでは?と思いましたがされないということは可読性が下がるかできないということでしょうね?)
使用頻度の低いメソッドだからこそこうやって近道する意味が生まれる、ということでした。なるほどです。
このときコードを短縮するのは処理を少しでも軽くするため?と思ったのですが、現代のPCスペックだと関係ないほど技術が向上しているようですね。たかだか十数年ですごいです。ですから、ソースコードを書くときは可読性第一で行きましょう。
ちなみに上記のように.(ドット)でメソッドをつなげていく方法をメソッドチェーンと呼ぶようです。
メソッドチェーンとは前のメソッドで返された値が持つメソッドを次々に実行していく方法です。必ず前のメソッドが返した値がメソッドを持っていること(つまりクラスのインスタンス?)が条件になります。
(そのインスタンス変数に対して複数の関係ないメソッドを使えるわけではないです!分解して式として考えるとよいでしょう)
下記URLはメソッドチェーンに関して参考にしました。