私は1つが最も性能を有するクラスの複雑なオブジェクト型の定数フィールドを初期化するための最良の方法であるのだろうか?
1)インライン初期化
public class TopClass {
private static final ComplexObject sdf = new ComplexObject();
public TopClass (
}
}
2)初期化メソッド
public class TopClass {
private static final ComplexObject sdf = initializeComplexObject();
private static ComplexObject initializeComplexObject(){
return sdf == null ? new ComplexObject() : sdf;
}
public TopClass (
}
}
3)コンストラクタで初期化、4)静的ブロックまたは他のどのようなアプローチあなたが提案する初期化子...
自衛隊は新しいTopClassクラスが作成されるたびに初期化していますか?私は初期に一度アプリケーション寿命の自衛隊フィールドをしたいです。
それはクラスに一度だけ行われるので、静的初期化子のパフォーマンスは、ほぼ、(特に、そのような些細な初期化のために)問題ではありません。
クラスが初期化されるとき、それが即座に呼び出されるため、2)この特定の方法アプローチは、冗長です。sdf
で常に呼び出すイニシャライザ静的メソッドは、あなたが(少なくとも、ない与えることの目的のために再度そのメソッドを呼び出していないことをする場合はnull sdf
異なる値を)。あなたが意図的に初期化されていない最後のフィールドを読んでいるので、それはまた、かなりropyです。
それでは、条件を削除し、あなたはメソッド呼び出しの間接て、アプローチ初期化子効果的にインラインで戻って終わります。
たとえば、あなたはタイムゾーンを設定する例えば、フォーマッタ上の他の構成をやってみたかった、場合メソッドのアプローチが有用であろう。
3)コンストラクタで静的メンバを初期化しないでください。コンストラクタはインスタンスメンバを初期化するためのものです。
特に、これは、静的フィールドは非最終的にする必要があります。彼らはヌル値を参照してくださいので、あなたがそのフィールドを初期化し、複数のスレッドを避けるために、フィールドへの更新の可視性を心配する必要があること、この手段
4)その宣言にフィールドを初期化すると、単に静的初期化子を宣言するための省略表現です。問題の最初のコードブロックは、これに意味的に同じです。
private static final ComplexObject sdf;
static {
sdf = new ComplexObject();
}
あなたがいないと逃げることができた場合、明示的にこれを行うには利点がありません。
静的初期化子は、ソートの匿名メソッド等です。彼らは必ずしもただ一つのフィールドを初期化するためにあなたを強制するため、Googleの内部のJavaの実践は、明示的にテストのためにそれらを呼び出すことができる部分であるため、代わりにブロック可能な場合は初期化明示的な静的な方法を使用することをお勧めしますが、も。( - 上に示されたように - バグの特定の種類をキャッチするために助けることができる私は、主に、これはあなたが方法でチェック明確な割り当てを失うことを良いアドバイスが、ノートであることに同意します)。
結論:使用private static final ComplexObject sdf = new ComplexObject();
、あなたはもっと複雑なものを必要としないので。
ここまでのところ大きな問題は、すなわちそれは確実に、正確であるsdf
スレッド間で共有されていません。あなたが質問を編集した前に、sdf
だっSimpleDateFormat
スレッドセーフではありませんされています、。私は何は考えていないComplexObject
ですが、あなたはそれがスレッドセーフである、またはそれは、スレッドセーフな方法でアクセスされていることをことのいずれかを確認する必要があります。マイクロ最適化の前にそのようなことを心配。