3

リンクされたリストの実装finalでは、多くの場所で使用されています。例えば

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}

final上記の実装でなぜ必要なのですか?新しい参照が作成され ( l)、last変更およびオーバーライドできるようになります。

4

3 に答える 3

4

finalここでは、ローカル変数は実際には必要ありません。これは、変数がメソッド内でそれ以上変更されないことを将来の開発者に示すだけです。もちろん、上記のメソッドでは、メソッドのどの時点でも参照の値を変更しlたくないでしょう。そこで、あなた(またはあなたのチームメイトの1人)が誤ってそのような変更を行った場合newNodefinalコンパイラはエラーを出します.

さらに、これにより、コンパイル時定数を参照するプリミティブ型を作成するなど、コンパイラーが独自の部分でいくつかのマイナーな最適化を行うようになる可能性があり、コンパイラーfinalはメソッド内で使用されている場所にそれらの変数をインライン化します。final修飾子はバイトコードに到達しないため、実行時のパフォーマンスはまったく影響を受けないことに注意してください。上で述べたように、これは開発者の意図を示すためだけのものであり、それ以上のものではありません。

于 2013-10-23T06:23:11.320 に答える
1

インスタンス変数「last」のコピーをメソッドの変数「l」に格納しているため、「l」は「last」が指していたオブジェクトを指します。メソッドの実行中にそのオブジェクトへのポインターを失わないようにする必要があります。したがって、「最後」が参照していたオブジェクトのみを指すと言うのは最終的です

于 2013-10-23T06:20:13.163 に答える
0

最終的なオブジェクト参照の ID が設定されると、その状態は変更できますが、ID は変更できません (つまり、オブジェクト参照を他のオブジェクトに再ポイントすることはできません)。

上記のスニペットでは、参照 l が他のオブジェクトを指していることは決して望んでいません。したがって、最終修飾子があります。新しい要素をリンクするためにも要素を知る必要があるため、この参照は非常に重要です。この参照を失う危険を冒すことはできないため、最終的なものとしてマークされています。

于 2013-10-23T06:23:05.257 に答える