Maison  >  Article  >  Java  >  Article Soyez prudent lorsque vous retournez des options

Article Soyez prudent lorsque vous retournez des options

DDD
DDDoriginal
2024-09-19 06:19:02518parcourir

Item  Seja criterioso ao retornar opcionais

Approches pré-Java 8 :

  • Throw exception : réservé aux situations exceptionnelles et coûteux en raison de la capture de trace de pile.
  • Return null : nécessite un code spécial pour gérer la possibilité de renvoyer null, ce qui peut provoquer des erreurs telles que NullPointerException.

L'approche Java 8 :

  • Présentation de la classe Optionnel, un conteneur immuable pouvant contenir une valeur ou être vide.
  • Évite l'utilisation de null et simplifie la gestion des valeurs manquantes sans lever d'exceptions.
  • Les méthodes peuvent renvoyer Facultatif pour représenter l'absence de valeur.

Avantages de l'utilisation de Facultatif :

  • Évite les exceptions et les problèmes avec null.
  • Permet au client de décider quoi faire lorsque la valeur est manquante (fournir la valeur par défaut, lever une exception, etc.).
  • Rend le code plus facile sans avoir besoin d'une gestion explicite des valeurs nulles.

Méthodes utiles de la classe Optionnelle :

  • Optional.of(value) : crée un Optionnel avec une valeur non nulle.
  • Optional.ofNullable(value) : crée un facultatif, mais accepte les valeurs nulles.
  • orElse(value) : renvoie une valeur par défaut si Facultatif est vide.
  • orElseThrow() : lève une exception si la valeur n'est pas présente.
  • map(), flatMap(), filter() : permettent la manipulation des valeurs au sein de l'optionnel.

Évitez d'impliquer des collections dans Facultatif :

  • Pour les types de conteneurs tels que des listes ou des tableaux, renvoyez des collections vides au lieu de Facultatif>.

Considérations relatives aux performances :

  • L'utilisation d'Optional a un coût en termes d'allocation d'objets.
  • Pour les types primitifs, utilisez OptionInt, OptionLong et OptionDouble pour éviter le coût de l'emballage.

Soyez prudent avec les autres utilisations de Facultatif :
Évitez de les utiliser comme clés ou valeurs de carte ou dans des collections.
Évitez de les utiliser comme champs d'instance à moins que cela ait du sens, comme dans les getters facultatifs.

Exemples de code
Exemple 1 : Utilisation de base de Facultatif

import java.util.Optional;

public class ExemploOptional {
    public static Optional<String> encontrarNome(String[] nomes, String nomeBuscado) {
        for (String nome : nomes) {
            if (nome.equalsIgnoreCase(nomeBuscado)) {
                return Optional.of(nome);
            }
        }
        return Optional.empty();  // Retorna Optional vazio se não encontrar o nome
    }

    public static void main(String[] args) {
        String[] nomes = {"João", "Maria", "Ana"};
        Optional<String> nomeEncontrado = encontrarNome(nomes, "Maria");

        nomeEncontrado.ifPresent(nome -> System.out.println("Nome encontrado: " + nome));
        System.out.println(nomeEncontrado.orElse("Nome não encontrado"));
    }
}

Exemple 2 : Utiliser orElseThrow

import java.util.Optional;

public class ExemploOrElseThrow {
    public static Optional<Integer> buscarIdade(String nome) {
        if (nome.equals("João")) {
            return Optional.of(30);
        }
        return Optional.empty();  // Retorna Optional vazio se o nome não for "João"
    }

    public static void main(String[] args) {
        Optional<Integer> idade = buscarIdade("Maria");

        // Lança uma exceção se o valor não estiver presente
        int valorIdade = idade.orElseThrow(() -> new IllegalArgumentException("Idade não encontrada!"));
        System.out.println("Idade: " + valorIdade);
    }
}

Exemple 3 : Facultatif avec les types primitifs

import java.util.OptionalInt;

public class ExemploOptionalInt {
    public static OptionalInt buscarIdade(String nome) {
        if (nome.equals("João")) {
            return OptionalInt.of(30);
        }
        return OptionalInt.empty();  // Retorna OptionalInt vazio se o nome não for "João"
    }

    public static void main(String[] args) {
        OptionalInt idade = buscarIdade("João");

        if (idade.isPresent()) {
            System.out.println("Idade encontrada: " + idade.getAsInt());
        } else {
            System.out.println("Idade não encontrada");
        }
    }
}

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:Numéro unique IArticle suivant:Numéro unique I