環境
開発をしていた際、チェックツールで
「getterのカプセル化というか隠蔽しろや」
みたいな感じで叱られた際の話です
探せば他のすごい方がもっといいコードを書いてそうな気もしますが
探し出せず・・・仕方なく自分で書いてみた結果になります。
ちなみに本記事はJava8を前提に書いております。
早速
叱られたコードは下記のようなメンバーにListクラスを持ったクラスです。
public class Hoge {
private List<String> myList;
public void setName(List<String> list) {
this.myList = list;
}
public List<String> getMyList() {
return myList;
}
}
現場現場でチェックツール的なものが文化的に育っているんですよね。。
ツールを動かし叱られて初めて知るその現場の文化w
ちなみに
?演算子使うな、とか内部クラス、内部インターフェースもダメ
というものから
メソッドは何行まで・・1行は何文字まで・・条件式は同時に何個まで・・
まぁ細かい文化だわw
でその中のひとつに今回の記事である隠蔽できてないよ警告があったわけで。
とりあえず
public List<String> getMyList() {
if(myList != null){
return new ArrayList<>(myList);
}else{
return null;
}
}
こんな感じでとりあえずチェックツールを回避。
せめて null を許容しなかったら
public List<String> getMyList() {
return new ArrayList<>(myList);
}
だけで良かったんだけど。
ワンライナーで頑張る
チェックツールで他の警告を潰したところで上記の部分を再着手。
ただのSetterGetterしかないCでいう構造体のようなクラスに
if文は入れたくないよね。
ということで頑張ってみた結果、以下のようになりました。
public List<String> getMyList() {
return Optional.ofNullable(myList).filter(l -> l != null).map(v -> new ArrayList<>(v)).orElse(null);
}
んー長いですねw
nullを許容するとこうなるのか・・・
ただのSetterGetterしかないCでいう構造体のようなクラスに
if文は入れたくないよね。
と書きましたが、filter結合子入ってるからif文と同じだろ?
という突っ込みは受け付けません。
※カバレージ(c1)的にはセーフかも?
あとがき、とか
備忘録として書いてますが
誰か他の方に役立ってくれると幸いです。
他、参考にした記事です。
JavaのGetterで参照を返すことについて
以上ありがとうございました。