Khởi tạo và huỷ đối tượng trong Java

Sử dụng phương thức khởi tạo tĩnh

Tara
Coding For Fun
3 min readJul 6, 2019

--

Tôi sẽ việt một loạt các bài viết về việc đi sâu vào vấn đề khởi tạo và huỷ đối tượng trong Java, đây là vấn đề không mới nhưng hiểu về nó một cách đầy đủ thì không phải dễ. Qua đó chúng ta sẽ biết khi nào và như thế nào để tránh khởi tạo chúng. Cách để đảm bảo đối tượng được huỷ an toàn.

Sử dụng method thay vì hàm khởi tạo…

Cách dễ nhất để khởi tạo một đối tượng trong Java là cung cấp hàm khởi tạo, với thuộc tính public. Một cách khác, ít được biết đến là sử dụng một phương thức khởi tạo tĩnh gọi là static-factory-method, no có nhiệm vụ trả về thể hiện của đối tượng. Dưới đây là ví dụ cho khởi tạo đối tượng Boolean từ giá trị đầu vào kiểu boolean sử dụng static-factory-method:

ví dụ về một static-fatory-method

Phương pháp này không giống Factory Method trong Design Pattern…

Phương pháp được mô tả trong bài viết này hoàn toàn khác khái niệm về Factory Method trong Design Pattern.

Một lớp có thể cung cấp cho đối tượng sử dụng nó static-factory-method thay vì một hàm khởi tạo public. Tuy vậy phương pháp này có cả ưu và nhược điểm.

Không giống như hàm khởi tạo public, static-factory-method có tên gọi…

Các lập trình viên đã khắc phục việc một lớp có một hàm khởi tạo duy nhất và một chữ ký trùng tên lớp. Họ tạo ra các hàm khởi tạo cùng tên và chỉ khác nhau danh sách tham số, tuy nhiên việc này vẫn gây nhầm lẫn vì không biết khi nào nên sử dụng hàm khởi tạo nào do chữ ký trùng nhau. Để giải quyết vấn đề này sử dụng các static-factory-method với các tên gọi cụ thể, việc này tránh được nhầm lẫn và làm nổi bật sự khác biệt giữa chúng.

Không bắt buộc luôn tạo ra đối tượng khi gọi hàm…

Như chúng ta thấy ở ví dụ về khởi tạo đối tượng Boolean, rõ ràng nó không bao giờ tạo ra một đối tượng mới mà sử dụng đối tượng có sẵn. Kỹ thuật này giống phương pháp Flyweight trong Design Pattern.

Nó có thể trả về bất kỳ đối tượng nào…

Với static-factory-method, chúng ta có thể trả về bất kỳ đối tượng nào nếu muốn.

Nó kén lập trình viên…

Vì nó ko phải là một phương pháp được giới thiệu trong các tài liệu lập trình Java nên rất khó để tìm một phương pháp chuẩn khi nào sử dụng nó thay vì sử dụng hàm khởi tạo public.

Một số ví dụ…

  • Date d = Date.from(instant).
  • Set<Rank> faceCards = EnumSet.of(JACK, QUEEN, KING);
  • BigInteger prime = BigInteger.valueOf(Integer.MAX_VALUE);
  • StackWalker luke = StackWalker.getInstance(options);
  • Object newArray = Array.newInstance(classObject, arrayLen);
  • List<Complaint> litany = Collections.list(legacyLitany);
  • BufferedReader br = Files.newBufferedReader(path);
  • FileStore fs = Files.getFileStore(path);

Cảm ơn đã đọc!

--

--