20 bonnes pratiques Java
Certaines des meilleures pratiques Java qui vous aideront à améliorer la qualité de votre code.
1-Préférer les primitives aux wrappers primitifs lorsque cela est possible.
Long idNumber;
long idNumber; // long takes less memory than Long
int birthYear;
short birthYear; // better because birth year can not be more than 32767
int personRunningSpeedKmHour;
byte personRunningSpeedKmHour; // better because a person can not have
// more than 127 km/h as speed
public boolean isOdd(int num) {
return (num & 1) != 0;
}
// best way to check the oddity of a number
String name = null; // redundant
int speed = 0; // redundant
boolean isOpen = false; // redundant
String name;
int speed;
boolean isOpen;
// same values in a cleaner way
public int age; // very bad
int age; // bad
private int age; // good
String s1 = new String("AnyString") ; // bad : low instantiation
// The constructor creates a new object, and adds the literal to the heap
String s2 = "AnyString" ; // good: fast instantiation
// This shortcut refers to the item in the String pool
// and creates a new object only if the literal is not in the String pool.
String address = streetNumber +" "+ streetName +" "
+cityName+" "+cityNumber+" "+ countryName; // bad
StringBuilder address = new StringBuilder(streetNumber).append(" ")
.append(streetName).append(" ").append(cityName).append(" ")
.append(cityNumber).append(" ").append(countryName); // good
8-Utilisation de traits de soulignement dans les littéraux numériques.
int myMoneyInBank = 58356823;
int myMoneyInBank = 58_356_823; // more readable
long billsToPay = 1000000000L;
long billsToPay = 1_000_000_000L; // more readable
for (int i = 0; i < names.length; i++)
{ saveInDb(names[i]); }
for (String name : names)
{ saveInDb(name); } // cleaner
Scanner scanner = null;
try
{scanner = new Scanner(new File("test.txt"));
while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException e)
{e.printStackTrace();}
finally
{if (scanner != null)
{scanner.close();}}
// error-prone as we can forget to close the scanner in the finally block
try (Scanner scanner = new Scanner(new File("test.txt")))
{while (scanner.hasNext())
{System.out.println(scanner.nextLine());}}
catch (FileNotFoundException fnfe)
{fnfe.printStackTrace();}
// cleaner and more succinct
try
{ productPrice = Integer.parseInt(integer); }
catch (NumberFormatException ex)
{ }
// fail silently without giving any feedback
try
{ productPrice = Integer.parseInt(integer); }
catch (NumberFormatException ex)
{unreadablePrices.add(productPrice); // handle error
log.error("Cannot read price : ", productPrice );// proper and meaningful message
}
- Renvoyer des collections vides au lieu de renvoyer des éléments nuls
- Utilisez
Optionalcomme vous pouvez requireNonNullMéthodes dejava.utils.ObjectsNotNull,NotEmpty,NotBlankAnnotationsObjects::nonNulldansStreamsrequireNonNullméthodes dansjava.util.Objects
14-Pour vérifier l'égalité, utilisez ==pour les références et equalspour les objets
// prerequisite: the person class overrides equals() and hashCode()
Person p1 = new Person("John","Doe");
Person p2 = new Person("John","Doe");
System.out.println(p1 == p2); // false
System.out.println(p1.equals(p2)); // true
15-Toujours implémenter hashCode lorsque vous implémentez equals.
Pensez toujours à passer outre hashCodesi vous passez outre equalspour ne pas "rompre le contrat".
Selon l'API, le résultat renvoyé par la hashCode()méthode pour deux objets doit être le même si leurs equalsméthodes montrent qu'elles sont équivalentes. L'inverse n'est pas nécessairement vrai.
16-Favoriser les enregistrements (depuis java14) pour les données immuables
public final class Person {
private final String name;
private final long idNumber;
public Person(String name, long idNumber) {
this.name = name;
this.idNumber = idNumber;
}
public boolean equals(Object other) {
if (other == this) return true;
if (other == null) return false;
if (other.getClass() != this.getClass()) return false;
Person that = (Person) other;
return (this.name.equals(that.name)) && (this.idNumber == that.idNumber);
}
public String toString() {
return name + " " + idNumber;
}
public int hashCode() {
return Objects.hash(idNumber, name);
}
}
// this class can be transformed to a record:
record Person(String name, long idNumber) { } // cleaner and less verbose
public final class MyValues {
private MyValues() {
// No need to instantiate the class, we can hide its constructor
}
public static final String VALUE1 = "foo";
public static final String VALUE2 = "bar";
}
// <-- empty line
@Repository
public class ...
20-Pour la gestion du type de date java.handling.java.localDateTimeest recommandée depuis java 8.
Pour voir plus de bonnes pratiques Java, je recommande ces excellents livres : Clean code et Effective java .
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































