目次
- 目次
- はじめに
- コンストラクタの代わりにstaticファクトリメソッドを検討する。
- あるクラスの引数が多かったり、オプション設定などがある場合は、builderパターンを使う
- 全ての関数の引数はチェックをし、publicな関数はException を投げ、privateなものはAssertionを使う。
- 絶対に来ない所では、AsserttionErrorを投げる
- nullチェックにはObjects.requireNonNullを使う
- Dateは使わないようにする
- 参照型を引数で受け取る時は防御的にコピーしてフィールドにする
- クラスがpublicでなければ、アクセッサはいらない。
- try-finallyよりもtry-with-resourcesを選ぶ
- ネストクラスはインスタンス化が不要であればstaticにしておく。
- 参考資料
- MyEnigma Supporters
はじめに
Effective * を読んで心に響いたシリーズのEffective Java編です。
Javaの中級を目指す人にはおすすめの一冊でした。
入門は下記を参照ください。
コンストラクタの代わりにstaticファクトリメソッドを検討する。
キーワード引数もなく、JuliaのようにMultiple dispatchではないJavaのコンストラクタは
昔から使いづらいなと思ってたので、自分もファクトリメソッドの方が好きです。
あるクラスの引数が多かったり、オプション設定などがある場合は、builderパターンを使う
これが一番感動しました。
キーワード引数がないJavaでは複雑なインスタンスをつくるには、
この方法がいいと思います。
実装方法は下記を参照ください。
全ての関数の引数はチェックをし、publicな関数はException を投げ、privateなものはAssertionを使う。
ExceptionとAssertionの使い分けをたまに悩むのですが、
publicなものにはExceptionにし、ドキュメント化し、
privateなものにはデバックを用意にするためにAssertionを使うというのはいいと思いました。
Assertionであれば、最終版では無効化し、パフォーマンスにも影響でないですし。
Javaでは、java -ea
とオプションをつけるとAssersionがオンになります。
絶対に来ない所では、AsserttionErrorを投げる
assert False
でもいいですが、
throw new AssertionError("Opps");
のほうが、メッセージがかけていいなと思いました。
nullチェックにはObjects.requireNonNullを使う
Java 7で追加されたObjects.requireNonNullメソッドは、Null検査に便利です。
Dateは使わないようにする
java8以前では、日時のクラスにjava.util.Dateを使っていましたが、
そもそもイミュータブルではないなど、色々問題がありました。
そこでjava8からは、新しいjava.time.*を使うことが推奨されています。
詳細はこちら:
参照型を引数で受け取る時は防御的にコピーしてフィールドにする
参照型をそのままフィールドで持っていると、外部から変更されて影響を受ける可能性があるので、
newをして防御的にコピーして保持する方法を学びました。
クラスがpublicでなければ、アクセッサはいらない。
自分しか使わないのであれば、そうですよね。
try-finallyよりもtry-with-resourcesを選ぶ
Pythonのwithを使ったコンテキストマネージャと同じ感じですね。
便利そうです。
Python のコンテキストマネージャと with ブロック - Python の基本 - Python 入門
ネストクラスはインスタンス化が不要であればstaticにしておく。
ネストクラスをうまく使えていなかったので、かなり勉強になりました。
こちらに書かれている通り、できるだけstaticネストクラスを使ったほうが良いようです。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。