Maison >Java >javaDidacticiel >Pourquoi Java exige-t-il que les variables dans les expressions Lambda soient définitives ou effectivement finales ?

Pourquoi Java exige-t-il que les variables dans les expressions Lambda soient définitives ou effectivement finales ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-02 14:53:40570parcourir

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

Correction de l'erreur "La variable utilisée dans l'expression lambda doit être finale ou effectivement finale"

Cette erreur se produit lors de la tentative d'accès à un fichier non final variable dans une expression lambda. Pour le résoudre, la variable doit être déclarée finale ou effectivement finale.

Finalité effective

La finalité effective signifie que la variable ne peut pas être réaffectée après avoir été initialisée. Ceci peut être réalisé en :

  • Déclarer la variable comme finale dans la portée externe
  • Assurer que la variable n'est affectée qu'une seule fois dans le lambda

Pourquoi cela est-il appliqué ?

La spécification du langage Java (JLS) stipule que « la restriction à l'utilisation efficace Les variables finales interdisent l'accès aux variables locales à changement dynamique, dont la capture introduirait probablement des problèmes de concurrence. En appliquant cela, Java évite les incohérences potentielles des données et les problèmes de thread.

Exemple

Considérez le code suivant :

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;
}

La variable calTz est non déclaré final, conduisant à l'erreur. Pour résoudre ce problème, nous pouvons modifier le code comme suit :

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

Alternativement, nous pouvons garantir que calTz n'est attribué qu'une seule fois dans le lambda :

private TimeZone extractCalendarTimeZoneComponent(Calendar cal, TimeZone calTz) {
    ...
    if (calTz == null) {
        calTz = TimeZone.getTimeZone(v.getTimeZoneId().getValue());
    }
    ...
}

Considérations supplémentaires

Cette exigence s'applique également aux classes internes anonymes. Par exemple, le code suivant provoquerait également l'erreur :

new Thread(() -> {
    int i = 0; // Effectively final as it's only assigned once
    i++; // Error: cannot mutate effectively final variable
}).start();

En appliquant ces règles, Java aide à prévenir les bogues potentiels et favorise la sécurité de la concurrence dans les applications multithread.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:JOUR 19 décembreArticle suivant:JOUR 19 décembre