Computer >> Máy Tính >  >> Lập trình >> Java

Làm thế nào để tạo một lớp bất biến với các tham chiếu đối tượng có thể thay đổi trong Java?

Đối tượng bất biến là những đối tượng có trạng thái không thể thay đổi sau khi khởi tạo . Đôi khi cần tạo một lớp bất biến theo yêu cầu. Ví dụ:Tất cả các lớp trình bao bọc nguyên thủy (Integer, Byte, Long, Float, Double, Character, Boolean và Short) là bất biến trong Java. Lớp chuỗi cũng là một lớp bất biến.

Để tạo một lớp bất biến tùy chỉnh, chúng ta phải thực hiện các bước sau

  • Khai báo lớp là cuối cùng vì vậy nó không thể được gia hạn.
  • Đặt tất cả các trường ở chế độ riêng tư do đó không được phép truy cập trực tiếp.
  • Không cung cấp phương pháp setter (các phương thức sửa đổi trường) cho các biến, do đó, nó không thể được đặt.
  • Đặt tất cả các trường có thể thay đổi là cuối cùng để các giá trị của chúng chỉ có thể được chỉ định một lần.
  • Khởi tạo tất cả các trường thông qua phương thức khởi tạo thực hiện bản sao sâu.
  • Thực hiện sao chép các đối tượng trong các phương thức getter để trả về một bản sao thay vì trả về tham chiếu đối tượng thực tế.
  • Nếu các trường đối tượng bao gồm tham chiếu đến các đối tượng có thể thay đổi , không cho phép thay đổi những đối tượng đó
  • Không cung cấp các phương pháp sửa đổi có thể thay đổi đối tượng .
  • Không chia sẻ tài liệu tham khảo đối với các đối tượng có thể thay đổi . Không bao giờ lưu trữ các tham chiếu đến các đối tượng bên ngoài, có thể thay đổi được chuyển cho hàm tạo. Nếu cần, hãy tạo các bản sao và lưu trữ các tham chiếu đến các bản sao. Tương tự, hãy tạo bản sao của các đối tượng có thể thay đổi bên trong của chúng tôi khi cần thiết để tránh trả lại bản gốc trong các phương thức của chúng tôi.

Ví dụ

// Employee.java
final class Employee {
   private final String empName;
   private final int age;
   private final Address address;
   public Employee(String name, int age, Address address) {
      super();
      this.empName = name;
      this.age = age;
      this.address = address;
   }
   public String getEmpName() {
      return empName;
   }
   public int getAge() {
      return age;
   }
   /* public Address getAddress() {
      return address;
      }
   */
   public Address getAddress() throws CloneNotSupportedException {
      return (Address) address.clone();
   }
}
// Address.java
class Address implements Cloneable {
   public String addressType;
   public String address;
   public String city;
   public Address(String addressType, String address, String city) {
      super();
      this.addressType = addressType;
      this.address = address;
      this.city = city;
   }
   public String getAddressType() {
      return addressType;
   }
   public void setAddressType(String addressType) {
      this.addressType = addressType;
   }
   public String getAddress() {
      return address;
   }
   public void setAddress(String address) {
      this.address = address;
   }
   public String getCity() {
      return city;
   }
   public void setCity(String city) {
      this.city = city;
   }
   public Object clone() throws CloneNotSupportedException {
      return super.clone();
   }

   @Override
   public String toString() {
      return "Address Type - "+addressType+", address - "+address+", city - "+city;
   }
}
// MainClass.java
public class MainClass {
   public static void main(String[] args) throws Exception {
      Employee emp = new Employee("Adithya", 34, new Address("Home", "Madhapur", "Hyderabad"));
      Address address = emp.getAddress();
      System.out.println(address);
      address.setAddress("Hi-tech City");
      address.setAddressType("Office");
      address.setCity("Hyderabad");
      System.out.println(emp.getAddress());
   }
}

Trong ví dụ trên, thay vì trả lại Địa chỉ ban đầu đối tượng, chúng tôi sẽ trả về một bản sao được nhân bản sâu của trường hợp đó. Lớp địa chỉ phải triển khai Có thể sao chép giao diện.

Đầu ra

Address Type - Home, address - Madhapur, city - Hyderabad
Address Type - Home, address - Madhapur, city - Hyderabad