Copier constructeur en Java

Note du traducteur: https: article //www.baeldung.com/ est une très grande qualité du site de la technologie anglaise, les étudiants intéressés peuvent aller à l'apprentissage d'accès.

1. introduction

Copie constructeur en Java est un objet de la configuration de la classe en tant que méthode d'utilisation d'un autre objet.

Très utile lorsque vous avez besoin de copier un objet complexe avec plusieurs variables membres ou si vous voulez une copie en profondeur de l'objet pour construire un objet qui existe déjà.

Note du traducteur: Cet article est très simple, mais très pratique. Bien que l'utilisation de combat avec plus constructeur de copie, mais est une très bonne technique.

2. Comment créer un constructeur de copie

Pour créer un constructeur de copie, et la présente première nécessité de déclarer des classes avec le même type d'argument au constructeur:

public class Employee {
    private int id;
    private String name;
   
    public Employee(Employee employee) {
    }
}

Ensuite, chacun des attributs d'objet de paramètres sont copiés dans la nouvelle instance.

public class Employee {
    private int id;
    private String name;
     
    public Employee(Employee employee) {
        this.id = employee.id;
        this.name = employee.name;
    }
}

Les pratiques ci-dessus tombent copie peu profonde.

Int propriétés définies ci-dessus ne sont pas String, ne contient que des types primitifs et immuable, et donc pas de copie de problème avant de l'utiliser.

Cependant, si la classe contient le type de variable sera réalisée par le constructeur en profondeur de copie.

Pour obtenir copie en profondeur, nous avons besoin d'une nouvelle instance du type d'objet en fonction de la configuration variable d'origine.

public class Employee {
    private int id;
    private String name;
    private Date startDate;
 
    public Employee(Employee employee) {
        this.id = employee.id;
        this.name = employee.name;
        this.startDate = new Date(employee.startDate.getTime());
    }
}

3. Copiez constructeur VS Clone

En Java, nous pouvons également utiliser l'implémentation de la méthode clone crée un nouvel objet à partir d'un objet existant.

Mais l'avantage du constructeur de copie:

  • Copie constructeur a mis en œuvre plus simplement. Pas besoin de mettre en œuvre l'interface Cloneable n'a pas besoin de traiter CloneNotSupportedException

  • fonction clone renvoie une référence à un objet de type commun. Aussi, vous devez activer un type spécifique.

  • La propriété ne peut être attribué pour le processus de clone final, mais peut copier constructeur.

4. succession

Copie constructeur en Java n'est pas hérité par les sous-classes.

Donc, si nous essayons d'initialiser une classe parente avec une référence d'objet de sous-classe, il fera face à une conversion de type.

Pour mieux illustrer ce problème, nous avons d'abord créer un sous-type et constructeur de copie de l'employé.

public class Manager extends Employee {
    private List<Employee> directReports;
    // ... 其他构造方法
 
    public Manager(Manager manager) {
        super(manager.id, manager.name, manager.startDate);
        this.directReports = directReports.stream()
          .collect(Collectors.toList());
    }
}

Ensuite, nous déclarons un type de point de référence des employés cas gestionnaire construits par le constructeur Manager.

Employee source = new Manager(1, "Baeldung Manager", startDate, directReports);

Parce que les types de référence des employés, si l'on veut utiliser le constructeur gestionnaire de copie devrait être forte dans le type de source Manager.

Employee clone = new Manager((Manager) source);

Si le paramètre est le type de gestionnaire jeter ClassCastException lors de l'exécution.

Dans lequel, lorsqu'un procédé pour éviter méthode constructeur de copie de type de conversion est de créer une succession de fonctions de copie:

public class Employee {
   public Employee copy() {
        return new Employee(this);
    }
}
 
public class Manager extends Employee {
    @Override
    public Employee copy() {
        return new Manager(this);
    }
}

Il se dit au type de copie fonction constructeur de copie pour chaque classe.

Cela garantit que le même type d'objet généré par l'objet et l'appel.

Employee clone = source.copy();

5. Conclusion

Cet article décrit le constructeur de copie, donne raison de ne pas utiliser la fonction clone.

Si le type d'objet réel de type de référence est un sous-type, sous-type en utilisant constructeur de copie devra sous-type supertype coulé, sujettes à la conversion. Cet article prévoit également une solution à ce problème.

Soutenir l' article source: tutoriels GitHub


Si vous pensez que cet article est utile pour vous, bienvenue pouces vers le haut, vers l'avant, commentaire, Votre soutien est la plus grande force motrice de mon travail.

Publié 379 articles originaux · a gagné les éloges 862 · Vues 1,32 millions +

Je suppose que tu aimes

Origine blog.csdn.net/w605283073/article/details/103639889
conseillé
Classement