Une gestion d’erreur de son API .Net automatique via ses exceptions
...
Dans cet article nous allons aborder la différence entre l’opérateur « == » et la méthode .equals() qui permettent de comparer deux Strings.
Sommaire
Commençons par faire quelques tests pour essayer de voir en quoi ils diffèrent.
String prenom1 = "Maxime";
String prenom2 = "Maxime";
System.out.println(prenom1 == prenom2); //true
System.out.println(prenom1.equals(prenom2)); //true
Jusqu’ici tout va bien, les deux comparaisons renvoient « true ».
String prenom1 = "Maxime";
String prenom2 = "Vincent";
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //false
Ici aussi les opérateurs amènent au même résultat, voyons un cas où ça se complique :
String prenom1 = new String("Maxime");
String prenom2 = new String("Maxime");
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //true
Dans ce dernier cas, les valeurs retournées par les deux comparaisons diffèrent.
La valeur des deux Strings est identique, pourtant la comparaison avec l’opérateur « == » renvoie faux. Cela signifie que contrairement à ce que l’on pourrait penser, cet opérateur ne compare pas les valeurs données aux Strings.
Cette méthode compare la valeur des Strings. On peut s’en convaincre en regardant cette méthode dans la classe String ou en prenant connaissance de sa description dans la doc (cf https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#equals(java.lang.Object) )
Cet opérateur va vérifier si les objets ont la même référence, c’est-à-dire s’ils pointent vers la même adresse mémoire (et non leur valeur !).
Nous allons afficher le Hash Code généré par la méthode « identityHashCode() ». Si ce Hash Code est identique pour deux objets, alors leur référence est identique (cf https://stackoverflow.com/questions/580984/how-do-you-get-the-object-reference-of-an-object-in-java-when-tostring-and-h pour plus de détails).
String prenom1 = "Maxime";
String prenom2 = "Maxime";
System.out.println(prenom1 == prenom2); //true
System.out.println(prenom1.equals(prenom2)); //true
System.out.println(System.identityHashCode(prenom1)); //168423058
System.out.println(System.identityHashCode(prenom2)); //168423058
Dans ce cas, les deux variables pointent vers la même adresse :
Comme il y a déjà une String avec la valeur désirée, prenom2 va pointer vers l’adresse de celle-ci. C’est pourquoi prenom1 et prenom2 ont le même Hash Code.
String prenom1 = "Maxime";
String prenom2 = "Vincent";
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //false
System.out.println(System.identityHashCode(prenom1)); //168423058
System.out.println(System.identityHashCode(prenom2)); //821270929
Ici, les valeurs des Strings sont différentes, prenom1 et prenom2 pointent donc logiquement vers des adresses différentes.
String prenom1 = new String("Maxime");
String prenom2 = new String("Maxime");
System.out.println(prenom1 == prenom2); //false
System.out.println(prenom1.equals(prenom2)); //true
System.out.println(System.identityHashCode(prenom1)); //168423058
System.out.println(System.identityHashCode(prenom2)); //821270929
Ce dernier cas est plus complexe. En effet, même si une String avec la valeur « Maxime » existe déjà, l’instruction « new » va créer une nouvelle String sans contrôler le fait qu’une String avec la même valeur existe déjà. La variable « prenom2 » va pointer vers cette nouvelle String alors que « prenom1 » va pointer vers la première String. C’est pour cette raison que ces deux variables ont un Hash Code différent.
La méthode. equals() est à utiliser pour comparer la valeur de deux Strings tandis que l’opérateur « == » les compare par référence. Pour aller plus loin et comprendre un peu mieux comment ça se traduit dans la JVM, vous pouvez vous rendre sur cet article (https://www.geeksforgeeks.org/string-constant-pool-in-java/).
Sources
https://stackoverflow.com/questions/7520432/what-is-the-difference-between-and-equals-in-java
On va voir comment avoir en quelques minutes des assertions qui vont vérifier les endpoints de notre API avec des scénarios de ce genre: Feature: Create a new account As a visitor, I can create an account to access the game Scenario: A visitor c...
Depuis .NET 9, le le support d’OpenAPI est directement inclus dans .NET et ne passe plus par les librairies Swagger par défaut (plus d’info sur ce choix ici si jamais ça vous intéresse). De façons simplifiée, la librairie Swashbuckle.AspNetCore.Sw...
Description du problème Par défaut, il n’est pas autorisé de faire des requêtes entre une application qui est dans un domaine A vers une autre qui serait dans un domaine B (pour des raisons de sécurité, il y a plus de détails dans les sources). S...