3

私の現在のプロジェクトでは、すべてのクラスフィールドとメソッド内の変数が可能な限りfinal修飾子で宣言されていることに気づきました。

ここのように:

private final XMLStreamWriter _xmlStreamWriter;
private final Marshaller _marshaller;
private final OutputStream _documentStream;

private final OutputStream _stylesStream;
private final XMLStreamWriter _stylesStreamWriter;
private final StyleMerger _styleMerger;

public DocumentWriter(PhysicalPackage physicalPackage) throws IOException {
    final Package pkg = new Package(physicalPackage);

    final Part wordDocumentPart = pkg.createPart(
            "/word/document.xml",
            "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml",
            "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument");

    // styles.xml
    final Pair<Part, String> wordStylesPart = wordDocumentPart.createRelatedPart(...);
    ...
}

そうする理由はありますか?

ps私が知っているように、プロジェクトはマルチスレッド化されるべきではありません(少なくとも私はそれについて何も聞いていません)。

4

5 に答える 5

4

finalを作成すると、コンパイラと人間のリーダーの両方に、この変数が一度設定されてから変更されないことを通知します。

コンパイラーはこれを使用して、変数を誤って再割り当てしていないことを確認します。これを行うと、コンパイルエラーが発生します。

人間の読者はそれを使用して、コードの意図をより迅速に理解できます。

通常、これを見逃してもコードが失敗することはありませんが、フィールドを変更しないようにする場合は、明示的に指定することをお勧めします。ローカルクラスを使用する場合など、ファイナルが必須の場合もあることにも注意してください。

ローカルクラスは、包含クラスによって定義されたフィールドにアクセスするだけでなく、ローカルメソッド定義のスコープ内にあり、finalとして宣言されているローカル変数、メソッドパラメーター、または例外パラメーターにアクセスできます。

一方、変数に再割り当てできるようにしたい場合もあります。明らかに、この場合、最終的なものとして宣言するべきではありません。

于 2010-03-27T18:49:42.027 に答える
4

プログラミングでは、論理エラーよりもコンパイラエラーを取得するのが最善です。コンパイラエラーは数秒で検出され、非常に高速に修正されます。

finalキーワードは、あまり労力をかけずにロジックエラーをコンパイラエラーに変換するのに役立ちます。

例えば:

public int test(int num){
   num = 10;
   x = num*2
   return  x;
}

上記の例では、誤ってnum変数に新しい値を割り当てたため、戻り値が間違っている可能性があります。finalキーワードを使用すると、この種のエラーを防ぐことができます。

public int test(final int num){
       num = 10; //compiler error
       x = num*2
       return  x;
    }
于 2010-03-27T18:53:40.550 に答える
2

不変クラスは本質的にスレッドセーフであり、スレッド間で安全に共有できます。クラスfinalのすべてのフィールドを宣言した場合(およびクラス自体がfinalである場合)、各フィールド自体が不変であると仮定すると、そのオブジェクトはスレッド間で安全に共有できます。

于 2010-03-27T19:30:12.113 に答える
0

理論的には、JVMはそれらをより適切に最適化できますが、実際に最適化されるかどうかはわかりません。finalは、変数に値を1回だけ割り当てることができることを示すために使用されます。

于 2010-03-27T18:50:20.060 に答える
-1

そして実際には、オブジェクトはアプリサーバー環境のような2つ以上のクラスローダーにあるため、最終的にも複数回割り当てられます。または、後で変更されたプロパティファイルから宣言されたfinalをロードします。ここで、宣言されたfinalを通常の変数に削除すると、より実用的になります。

于 2010-03-27T19:01:45.413 に答える