>  기사  >  Java  >  Java의 불변 클래스 및 해당 생성 규칙

Java의 불변 클래스 및 해당 생성 규칙

王林
王林원래의
2019-12-03 16:57:443579검색

Java의 불변 클래스 및 해당 생성 규칙

Immutable 클래스는 이름에서 알 수 있듯이 이 클래스가 인스턴스화된 후에는 재할당될 수 없음을 의미합니다. java 및 java.lang.String에서 제공하는 8개의 패키징 클래스는 모두입니다. 불변 클래스.

사용자 정의 불변 클래스를 생성할 때 따라야 할 규칙:

1 멤버 변수를 수정하려면 private 및 final을 사용하세요.

2. 멤버 변수 초기화를 위한 매개변수화된 생성자를 제공합니다.

3. 멤버 변수에 대해 setter 메서드를 제공하지 마세요.

4. 멤버 변수에 변수 클래스가 있는 경우 Object에서 hashCode 메서드와 equals 메서드를 다시 작성해야 합니다.

java 비디오 튜토리얼 권장 사항: javalearning

예: 변경 불가능한 Person 클래스 만들기

public class Person {
    private final String Name;
    private final String gender;
    
    /*
     * 无参构造方法
     */
    public Person(){
        this.Name="";
        this.gender="";
    }
    /*
     * 有参构造方法
     */
    public Person(String Name , String gender){
        this.Name = Name;
        this.gender = gender;
    }
    public String getName() {
        return Name;
    }
    public String getGender() {
        return gender;
    }
    /*
     * 重写hashCode方法
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @Override
    public int hashCode() {
        return Name.hashCode() + gender.hashCode();
    }
    /*
     * 重写equals方法
     * (non-Javadoc)
     * @see java.lang.Object#equals(java.lang.Object)
     */
    @Override
    public boolean equals(Object obj) {
        if(this == obj)
            return true;
        if(obj != null && obj.getClass() == this.getClass()){
            Person pe = (Person)obj;
            if(this.getName().equals(pe.getName()) && this.getGender().equals(pe.getGender()))
                return true;
        }
        return false;
    }

Above The member 이 Person 클래스의 변수는 모두 불변 클래스입니다. 변경 가능한 클래스가 있는 경우 위의 방법을 사용하여 불변 클래스를 생성하는 데 문제가 있습니다. 비록 Person의 속성은 불변이지만 속성에 의해 참조되는 객체는 변경 가능합니다. ,

이렇게 하면 다음 예와 같이 Person의 불변성이 파괴됩니다.

먼저 변경 가능한 클래스를 만듭니다. College

public class College {
    private String collNo;
    private String collName;
    public College(String collNo, String collName) {
        super();
        this.collNo = collNo;
        this.collName = collName;
    }
    public College() {
        super();
    }
    public String getCollNo() {
        return collNo;
    }
    public void setCollNo(String collNo) {
        this.collNo = collNo;
    }
    public String getCollName() {
        return collName;
    }
    public void setCollName(String collName) {
        this.collName = collName;
    }
    @Override
    public String toString() {
        return "College [collNo=" + collNo + ", collName=" + collName + "]";
    }

직접 참조 대학

public class Person {
    private final College college;
    public Person() {
        this.college = null;
    }
    public Person(College college) {
        super();
        this.college = college;
    }
    public College getCollege() {
        return college;
    }
    @Override
    public String toString() {
        return "Person [college=" + college + "]";
    }
    public static void main(String[] args){
        College coll = new College("123456","土木工程");
        Person pe = new Person(coll);
        System.out.println("----->" + pe);
        coll.setCollName("信息工程");                      //这样就会改变Person对象
        System.out.println("======>" + pe);
    }

그렇다면 변경 가능한 속성을 가진 변경 불가능한 클래스를 어떻게 만들 수 있을까요? ? 프로그램이 College 속성에 액세스하는 것을 불가능하게 만들기만 하면 됩니다

public class Person {
    private final College college;
    public Person() {
        this.college = null;
    }
    public Person(College college) {
        //创建一个和传入对象有相同属性的College,赋值给成员变量
        this.college = new College(college.getCollNo(),college.getCollName());
    }
    public College getCollege() {
        //创建一个College将属性的值赋值给它并返回
        return new College(this.college.getCollNo(),this.college.getCollNo());
    }
    @Override
    public String toString() {
        return "Person [college=" + college + "]";
    }

위의 아이디어는 외부 세계와 Person 클래스의 변수 속성 간의 연결을 분리하는 것입니다. 프로그램이 직접 작동할 수 없습니다. 속성에 대해 변수 클래스 불변 속성 클래스를 생성합니다.

추천 관련 기사 및 튜토리얼: java 입력 프로그램

위 내용은 Java의 불변 클래스 및 해당 생성 규칙의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.