blog

効果的なJavaでのオブジェクトの作成と破棄

オブジェクトの作成と破棄\nこの記事は Effective java を読んで書かれました。\nコンストラクタ・メソッドの代わりに最初の静的ファクトリ\nいくつかの利点があります:\n1. 静的ファク...

Jun 19, 2020 · 3 min. read
シェア

オブジェクトの作成と破棄

この記事は、『Effective java』の第2章を読んで書いたものです。

最初の静的ファクトリは、コンストラクタ・メソッド

いくつかの利点があります:

1.静的ファクトリーは名前を持ち、より簡単に認識できるクライアント側のコードを生成します。

2.呼び出しごとに新しいオブジェクトを作成する必要はありません。

4. パラメータ化された型のインスタンスを作成する際、ジェネリック型を使うなどして、コードがより簡潔になります。

ルールその2: コンストラクタの引数が複数ある場合はビルダーの使用を検討しましょう

ビルダーのおかげで、どのパラメータが必要で、どのパラメータが必須なのかがよりわかりやすくなり、構築のミスも少なくなります。

ルール#3: プライベート関数または列挙型によるシングルトンプロパティの強化

コンストラクタは非公開にする必要があります。2. 誰かがリフレクションを使用して新しいオブジェクトを作成するのを防ぐために、オブジェクトの既存のインスタンスがある場合、コンストラクタが再び呼び出されたときに例外をスローすることをお勧めします。3. また、シリアライズを実装し、readResolveメソッドを書き換える必要があります。readResolve をオーバーライドしないと、デシリアライズの際に新しいオブジェクトが作成されます。シングルトンには列挙型を使用することをお勧めします。個人的には、シングルトンの怠け者はハングリーマンよりも最適化されているように思います。

イウムがシンギュラリティを保証する方法について簡単に分析します。

これは分解されたenumクラスで、Enumを継承していることがよくわかります。

 /**
 * prevent default deserialization
 */
 private void readObject(ObjectInputStream in) throws IOException,
 ClassNotFoundException {
 throw new InvalidObjectException("can't deserialize enum");
 }
 private void readObjectNoData() throws ObjectStreamException {
 throw new InvalidObjectException("can't deserialize enum");
 }

上のコードからわかるように、シリアライズ・メソッドをオーバーライドしないとこの例外がスローされます。これによってシングルトンが保証されます。

第4条:民間建設業者との不即不離の強化

たとえば、たくさんの静的メソッドを含むツールクラスを書いたとします。しかし、静的メソッドをオブジェクトで呼び出したがる人がいます。

第5条 不要なオブジェクトを作らない

実際には、再利用上のオブジェクトを再利用することが可能であり、これは、最も基本的なすべてのパッケージングタイプで使用されている定数のいくつかの範囲のキャッシュを持って、 "階層パターン "として知られているデザインパターンで、例えば、Integer.valueOf()、この構文糖は、一般的に箱の自動開梱で使用されている、あなたは、逆コンパイルされたコードを見ることができます。定数プールに存在するオブジェクト、Stringもあります。そのため、しばしばnew String("")を使用する場合は、メモリについて考える必要があります!

第6条:陳腐化したオブジェクト参照の削除

オブジェクトの意味は、将来的に使用したくない、強い参照を削除してください、そのような静的変数リストの配列として、強い参照オブジェクトに彼を入れて続行しないでください、時間内に削除してください。使いたくないものは、忘れずに削除してください。

第7条:末端方法の回避

いわゆるファイナライザーメソッドですが、これを使わないほうがいい理由は、オブジェクトがいつリサイクルされるかわからないので、このメソッドがいつ実行されるかまったくわからないからです。

Read next