Nếu một class có tham chiếu đến một thực thể khác, được gọi là quan hệ HAS – A.
Ví dụ Chúng ta có class Student, một Student cần có các thông tin như id, name, email, etc. Và thực thể Address chứa các thông tin city, country, zipcode etc.
// File Student.java public class Student { String id; String name; Address address; }
// File Address.java public class Address { String city; String country; String zipcode; }
Class Student tham chiếu đến Address là một thực thể, chúng ta có thể phát biểu như sau: Student có quan hệ HAS – A Address.
Mục đích sử dụng HAS – A
Ở ví dụ trên, mình hoàn toàn có thể gộp các thuộc tính địa chỉ vào class Student như sau.
// File Student.java public class Student { String id; String name; String city; String country; String zipcode; }
Với cách làm trên của chúng ta là hoàn toàn ổn. Sau đó ứng dụng mở rộng chúng ta có thêm class Employee cũng cần sử dụng đến địa chỉ. Nếu như làm theo cách trên thì chúng ta phải duplicate các thuộc tính address cho Employee. Làm như vậy thì code sẽ trở nên dài dòng, giảm tính reused code của project.
Vậy nên chúng ta cần sử dụng HAS – A để tăng tính tái sử dụng code. Định nghĩa Address ra một class riêng, và Student, Employee đều tham chiếu đến Address.
Khi nào nên sử dụng HAS -A
Như đã bàn luận ở trên, sử dụng HAS – A làm tăng tính tái sử dụng code. Khi các bạn thấy giữa các class có các thông tin chung giống hệt nhau thì ta nên tách nhỏ nó ra thành một class khác bao gồm những thuộc tính chung.
Các bạn đừng nhầm lẫn HAS – A với IS – A(thừa kế) nha. Thừa kế là một khái niệm mà các class con sử dụng lại các thuộc tính và method của class cha có sẵn. HAS – A là đặt những điểm chung ra riêng một class và import vào các class khác để sử dụng.
Ví dụ
Address.java
// File Address.java public class Address { String city; String country; String zipcode; public Address(String city, String country, String zipcode) { this.city = city; this.country = country; this.zipcode = zipcode; } }
Student.java
// File Student.java public class Student { int id; String name; Address address; Student(int id, String name, Address address) { this.id = id; this.name = name; this.address = address; } void display() { System.out.println("ID: " + id); System.out.println("Name: " + name); System.out.println("Address: " + address.city + " " + address.country + " " + address.zipcode); } }
// File Main.java public class Main { public static void main(String[] args) { Address address = new Address("HCM", "VN", 11000); Student student = new Student(1, "Hai", address); student.display(); } }
Output:
ID: 1
Name: Hai
Address: HCM VN 11000