web-dev-qa-db-ja.com

なぜStringを(finalとして)宣言してから使用するのですか?

典型的なSpring MVCバリデータークラスでは、ErrorsオブジェクトにerrorCode値を挿入するときに、文字列(props.somefield.req) そのようです

errors.rejectValue("elementId", "props.somefield.req");

宣言された静的な最後の文字列と対になる?

private static final String SOMFIELD_REQ = "props.somefield.req"; ...
errors.rejectValue("elementId", SOMFIELD_REQ);

少しでもパフォーマンスは向上しますか?スタックオーバーフローに関するいくつかの質問を読みました( StringおよびfinalJavaでfinal Stringを定義することは理にかなっていますか? )が、誰も答えることができません- この質問 更新の質問。

8
happybuddha

実行時には、違いはありません。

ポイントは可読性です-メンバー変数として、それはクラスのソースコードの最初に宣言されている可能性が高く、静的にすることはクラスの新しいインスタンスごとに割り当てる必要がないことを意味します。

最終的にすることは、値が変更されないことを読者に示します(コンパイラーにとっても、ここではそれほど重要ではありません)。

この方法では、実装に埋め込まれた「マジックバリュー」はなく、「定数」への変更が必要な場合は、1か所で変更するだけで済みます。

これは基本的に、Cプログラマが#defineで何をするかを模倣しています。

21
GreyBeardedGeek

finalフィールドには多くの利点があります!

フィールドをfinalとして宣言すると、クラスを使用または拡張する開発者にとって、ドキュメントの有益な利点があります。これは、クラスがどのように機能するかを説明するのに役立つだけでなく、設計上の決定を実施する際にコンパイラの助けを借ります。 finalメソッドとは異なり、-最終フィールドを宣言すると、オプティマイザが最適化の決定を行うのに役立ちます。フィールドの値が変更されないことがコンパイラにわかっている場合、[レジスタの値finalフィールドは、フィールドが読み取り専用であることをコンパイラーに強制させることにより、安全性をさらに高めます。

パフォーマンス管理ツールとしてfinalを使用しないでください。プログラムのパフォーマンスを向上させるには、はるかに優れた、制約の少ない方法があります。 finalを使用して、プログラムの基本的なセマンティクスを反映します。クラスが不変であること、またはフィールドが読み取り専用であることを示します。

最終フィールドを宣言する前に、次のことを確認してください:このフィールドは変更可能である必要がありますか?

5
Anton Dozortsev