ホームページ > Java > &#&チュートリアル > Java ではラムダ式の変数が Final であること、または実質的に Final であることが要求されるのはなぜですか?

Java ではラムダ式の変数が Final であること、または実質的に Final であることが要求されるのはなぜですか?

Patricia Arquette
リリース: 2025-01-02 14:53:40
オリジナル
562 人が閲覧しました

Why Does Java Require Variables in Lambda Expressions to Be Final or Effectively Final?

「ラムダ式で使用される変数は Final または実質的に Final である必要がある」エラーの修正

このエラーは、final 以外の変数にアクセスしようとすると発生しますラムダ式内の変数。これを解決するには、変数が Final または事実上 Final として宣言されている必要があります。

Effective Finality

Effective Finality は、変数が初期化された後に再割り当てできないことを意味します。これは、次の方法で実現できます。

  • 外部スコープで変数を Final として宣言する
  • 変数がラムダ内で 1 回だけ割り当てられるようにする

なぜこれが強制されるのですか?

Java 言語仕様(JLS) は、「事実上最終変数への制限により、動的に変化するローカル変数へのアクセスが禁止されており、そのキャプチャにより同時実行の問題が発生する可能性があります。」と述べています。これを強制することで、Java は潜在的なデータの不整合やスレッドの問題を防ぎます。

次のコードを考えてみましょう。

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;
}
ログイン後にコピー

calTz 変数は次のとおりです。最終的に宣言されていないため、エラーが発生します。これを修正するには、コードを次のように変更します。

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, final TimeZone calTz) {
    ...
}
ログイン後にコピー

または、calTz がラムダ内で 1 回のみ割り当てられるようにすることもできます。

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
    ...
    if (calTz == null) {
        calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
    }
    ...
}
ログイン後にコピー

追加の考慮事項

この要件は匿名内部クラスにも適用されます。たとえば、次のコードでもエラーが発生します:

new Thread(() -> {
    int i = 0; // Effectively final as it's only assigned once
    i++; // Error: cannot mutate effectively final variable
}).start();
ログイン後にコピー

これらのルールを強制することで、Java は潜在的なバグを防止し、マルチスレッド アプリケーションの同時実行の安全性を促進します。

以上がJava ではラムダ式の変数が Final であること、または実質的に Final であることが要求されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート