Maison >Java >javaDidacticiel >Pourquoi les variables dans les expressions Lambda doivent-elles être définitives ou effectivement définitives ?

Pourquoi les variables dans les expressions Lambda doivent-elles être définitives ou effectivement définitives ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-22 21:00:13660parcourir

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

Pourquoi des variables immuables sont requises dans les expressions Lambda

L'erreur « La variable utilisée dans l'expression lambda doit être finale ou effectivement finale » se produit lorsqu'un La variable utilisée dans une expression lambda n'est pas définitive ou effectivement finale. Pour comprendre cette exigence, considérons 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;
}

Dans ce code, la variable « calTz » est utilisée dans l'expression lambda qui itère sur les composants d'un objet Calendrier. Cependant, « calTz » n'est pas déclaré comme « final » et n'est pas effectivement final (c'est-à-dire qu'il peut être modifié ultérieurement dans le code).

Selon la spécification du langage Java (JLS) §15.27.2, les variables capturées par les expressions lambda doivent être effectivement finales. Cela signifie que la variable ne doit pas être modifiée après avoir été capturée par le lambda. La raison de cette restriction est d'éviter les problèmes de concurrence qui peuvent survenir lorsque plusieurs threads accèdent et modifient potentiellement la variable capturée.

Pour résoudre l'erreur, vous pouvez modifier le code pour vous assurer que la variable 'calTz' est définitive. ou effectivement final. Une façon de procéder consiste à déclarer 'calTz' comme final :

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

Vous pouvez également rendre 'calTz' effectivement final en lui attribuant une valeur immédiatement et en vous assurant que la valeur n'est pas modifiée ultérieurement dans le code :

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

En respectant l'exigence selon laquelle les variables utilisées dans les expressions lambda doivent être finales ou effectivement finales, vous pouvez éviter les problèmes de concurrence potentiels et garantir que l'exactitude de votre code.

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