Maison >Java >JavaBase >Classes immuables en Java et leurs règles de création

Classes immuables en Java et leurs règles de création

王林
王林original
2019-12-03 16:57:443642parcourir

Classes immuables en Java et leurs règles de création

Classe immuable, comme son nom l'indique, signifie que cette classe ne peut pas être réaffectée après son instanciation. Les huit classes d'empaquetage fournies par Java et java.lang.String sont toutes des classes immuables.

Règles à suivre lors de la création d'une classe immuable personnalisée :

1 Utilisez private et final pour modifier les variables membres.

2. Fournir une méthode de construction paramétrée pour initialiser les variables membres.

3. Ne fournissez pas de méthodes de définition pour les variables membres.

4. S'il existe une classe de variable dans la variable membre, vous devez réécrire la méthode hashCode et la méthode égale dans Object.

Recommandation du didacticiel vidéo Java : apprentissage Java

Par exemple : créer une classe Person immuable

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;
    }

Les variables membres de la classe Person ci-dessus sont immuables classes, s'il y a des classes mutables, alors il y a un problème avec l'utilisation de la méthode ci-dessus pour créer des classes immuables. Bien que les attributs de Person soient immuables, les objets référencés par les attributs sont mutables,

Cela le fera. détruire l’immuabilité de Person, comme dans l’exemple suivant.

Créez d'abord une classe mutable 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 + "]";
    }

et référencez College

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

dans Person. Alors, comment pouvez-vous créer une classe immuable avec des attributs mutables ? Il suffit de rendre l'attribut College inaccessible au programme

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 + "]";
    }

L'idée ci-dessus est de séparer la connexion entre le monde extérieur et les attributs variables de la classe Person. Le programme ne peut pas agir directement sur les attributs, donc. création d'un attribut de classe variable.

Articles et tutoriels connexes recommandés : Programme d'entrée Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn