ホームページ >Java >&#&チュートリアル >ラムダ式の変数が最終的、または事実上最終的でなければならないのはなぜですか?

ラムダ式の変数が最終的、または事実上最終的でなければならないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-22 21:00:13697ブラウズ

Why Must Variables in Lambda Expressions Be Final or Effectively Final?

ラムダ式で不変変数が必要な理由

「ラムダ式で使用される変数は、最終または実質的に最終である必要があります」エラーが発生するのは、ラムダ式内で使用される変数は最終的ではなく、事実上最終的でもありません。この要件を理解するには、次のコードを考慮してください。

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
    try {
        cal.getComponents().getComponents("VTIMEZONE").forEach(component -> {
            VTimeZone v = (VTimeZone) component;
            v.getTimeZoneId();
            if (calTz == null) {
                calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
            }
        });
    } catch (Exception e) {
        log.warn("Unable to determine ical timezone", e);
    }
    return null;
}

このコードでは、Calendar オブジェクトのコンポーネントを反復するラムダ式内で 'calTz' 変数が使用されています。ただし、「calTz」は「final」として宣言されておらず、事実上最終ではありません(つまり、コードの後半で変更される可能性があります)。

Java 言語仕様 (JLS) §15.27.2 によると、ラムダ式によってキャプチャされる変数は、事実上、final である必要があります。これは、ラムダによってキャプチャされた後は変数を変更してはいけないことを意味します。この制限の理由は、複数のスレッドがアクセスしてキャプチャされた変数を変更する場合に発生する可能性のある同時実行性の問題を防ぐためです。

エラーを解決するには、「calTz」変数が最終的なものになるようにコードを変更します。または事実上最終的なもの。これを行う 1 つの方法は、'calTz' を Final として宣言することです。

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) {
    // ...
}

あるいは、'calTz' に値をすぐに割り当て、後でその値が変更されないようにすることで、'calTz' を事実上 Final にすることもできます。 code:

private TimeZone extractCalendarTimeZoneComponent(Calendar cal) {
    TimeZone calTz = null;
    try {
        // ...
    } catch (Exception e) {
        // ...
    }
    return calTz;
}

ラムダ式で使用される変数が Final または実質的に Final であるという要件に従うことで、潜在的な同時実行性の問題を回避でき、コードが正しいことを確認してください。

以上がラムダ式の変数が最終的、または事実上最終的でなければならないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。