Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Java에서 변경 가능한 객체 참조로 변경할 수 없는 클래스를 만드는 방법은 무엇입니까?

<시간/>

불변 개체 상태가 초기화되면 변경할 수 없는 개체입니다. . 때로는 요구 사항에 따라 변경할 수 없는 클래스를 만들어야 합니다. 예를 들어 모든 기본 래퍼 클래스 (Integer, Byte, Long, Float, Double, Character, Boolean 및 Short)는 Java에서 변경할 수 없습니다. 문자열 클래스 또한 변경할 수 없는 클래스입니다.

사용자 정의 변경할 수 없는 클래스를 만들려면 다음 단계를 수행해야 합니다.

  • 수업을 최종으로 선언 연장할 수 없습니다.
  • 모든 필드를 비공개로 설정 직접 액세스할 수 없도록 합니다.
  • setter 메소드를 제공하지 마세요. (필드를 수정하는 메소드) 변수에 대해 설정할 수 없도록 합니다.
  • 모든 변경 가능한 필드를 최종로 설정 값을 한 번만 할당할 수 있도록 합니다.
  • 생성자를 통해 모든 필드 초기화 딥 카피를 하고 있습니다.
  • 객체 복제 수행 getter 메서드에서 실제 개체 참조를 반환하는 대신 복사본을 반환합니다.
  • 인스턴스 필드에 변경 가능한 개체에 대한 참조가 포함된 경우 , 해당 개체가 변경되는 것을 허용하지 않습니다.
  • 변경 가능을 수정하는 메소드를 제공하지 마세요. 개체 .
  • 참조 공유 금지 변경 가능한 개체에 . 생성자에 전달된 변경 가능한 외부 개체에 대한 참조를 저장하지 마십시오. 필요한 경우 복사본을 만들고 복사본에 대한 참조를 저장합니다. 마찬가지로 메서드에서 원본을 반환하지 않도록 필요한 경우 내부 변경 가능한 개체의 복사본을 만듭니다.

예시

// 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());
   }
}

위의 예에서 원래 주소를 반환하는 대신 개체는 딥 클론 사본을 반환합니다. 그 인스턴스의. 주소 클래스는 복제 가능을 구현해야 합니다. 인터페이스.

출력

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