20 thực tiễn tốt nhất về java

Mar 09 2023
Một số phương pháp hay nhất về java sẽ giúp bạn nâng cao chất lượng mã của mình. 1-Ưu tiên các hàm nguyên thủy hơn các hàm bao nguyên thủy khi có thể.

Một số phương pháp hay nhất về java sẽ giúp bạn nâng cao chất lượng mã của mình.

1-Ưu tiên các hàm nguyên thủy hơn các hàm bao nguyên thủy khi có thể.

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-Sử dụng dấu gạch dưới trong Numeric Literals.

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
}

  • Trả về Bộ sưu tập rỗng thay vì trả về các phần tử Null
  • Sử dụng Optionalnhư bạn có thể
  • requireNonNullphương pháp củajava.utils.Objects
  • NotNull, NotEmpty, NotBlankChú thích
  • Objects::nonNullTRONGStreams
  • requireNonNullphương pháp trongjava.util.Objects

14-Để kiểm tra sự bằng nhau, dùng ==tham chiếu và equalsđối tượng

// 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-Luôn triển khai mã băm khi bạn triển khai bằng.
Hãy luôn nhớ ghi đè hashCodenếu ghi đè equalsđể không bị “phá kèo”.
Theo API, kết quả trả về từ hashCode()phương thức cho hai đối tượng phải giống nhau nếu equalsphương thức của chúng cho thấy chúng tương đương nhau. Điều ngược lại không nhất thiết phải đúng.

16-Bản ghi ưu tiên (kể từ java14) cho dữ liệu không thay đổi

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-Đối với việc xử lý loại ngày java.handling.java.localDateTimeđược khuyến nghị kể từ java 8.

Để xem thêm các phương pháp hay nhất về java, tôi giới thiệu những cuốn sách tuyệt vời sau: Clean code và Effective java .