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.
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.
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.
Conclusion
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/).
Il arrive que la code review nous empêche de merge nos PR assez vite et qu’on se retrouve à tirer une branche d’une branche de travail pour avancer 😔
Une fois la première PR squash et merge, la PR issue de la seconde branche se retrouve avec des conflits 💥
Si vous avez déjà vécu cette situation, il y a de bonnes chances que vous ayez cherry-pick vos commits de travail sur une...
Il arrive souvent que pour tester unitairement des règles de validation, on doive tester le même cas mais avec des exemples différents. Sans tests paramétrés, ça revient à faire un test par cas ce qui peut alourdir notre fichier de tests.
On va voir comme...
Avant .Net 8, tester du code qui utilise DateTime.Now() n’était pas trivial, on devait faire en sorte de mocker la Clock dans nos tests. Depuis .Net 8, c’est beaucoup plus facile grâce à TimeProvider inclut par défaut !
En deux mots, TimeProvider est une...
La gestion des erreurs de son API est très importante pour que les consommateurs puissent avoir une description claire du problème mais c’est souvent fastidieux à maintenir.
On va voir comment avoir des statuts de réponse cohérent et des messages d’erre...