20 prácticas recomendadas de Java
Algunas de las mejores prácticas de Java que lo ayudarán a mejorar la calidad de su código.
1-Favorecer las primitivas sobre los envoltorios primitivos cuando sea posible.
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-Uso de guiones bajos en literales numéricos.
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
}
- Devolver colecciones vacías en lugar de devolver elementos nulos
- Usa
Optionalcomo puedas requireNonNullmétodos dejava.utils.ObjectsNotNull,NotEmpty,NotBlankAnotacionesObjects::nonNullenStreamsrequireNonNullmétodos enjava.util.Objects
14-Para verificar la igualdad, use ==para referencias y equalspara objetos
// 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-Siempre implemente hashCode cuando implemente equals.
Recuerde siempre anular hashCodesi anula equalspara no "romper el contrato".
Según la API, el resultado devuelto por el hashCode()método para dos objetos debe ser el mismo si sus equalsmétodos muestran que son equivalentes. Lo contrario no es necesariamente cierto.
16-Favorecer registros (desde java14) para datos inmutables
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-Para el manejo de tipo fecha java.handling.java.localDateTimese recomienda desde java 8.
Para ver más prácticas recomendadas de Java, recomiendo estos excelentes libros: Código limpio y Java eficaz .

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































