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
Libérer: 2025-01-02 14:53:40
original
572 Les gens l'ont consulté

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;
}
Copier après la connexion

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) {
    ...
}
Copier après la connexion

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());
    }
    ...
}
Copier après la connexion

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();
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal