× Giới thiệu Lịch khai giảng Tin tức Sản phẩm học viên

Copy Constructor trong Java - Các ưu điểm và ví dụ cụ thể

10/11/2021 13:29

Đôi khi trong quá trình thực hiện dự án, lập trình viên rơi vào tình huống cần tạo một bản sao trùng lập và chính xác của một đối tượng hiện có trong một lớp. Do đó, lập trình viên sẽ muốn tạo một bản sao riêng biệt nhưng chính xác một trong các đối tượng hiện có để những thay đổi được thực hiện trong bản sao sẽ không thay đổi được thực hiện trong bản sao sẽ không phản ánh ở bản gốc và ngược lại. Java cung cấp một hàm tạo sao chép - Copy Constructor trong Java khiến điều này khả thi. Trong bài viết này, chúng ta sẽ tìm hiểu cách tạo và sử dụng hàm tạo bản sao Java với các ví dụ cụ thể.

Khái niệm Hàm tạo Copy Constructor trong Java 

Copy Constructor trong Java là một loại constructor đặc biệt được sử dụng để tạo một đối tượng mới bằng cách sử dụng đối tượng hiện có của một lớp mà chúng ta đã tạo trước. Hàm này tạo đối tượng mới bằng cách khởi tạo đối tượng với thể hiện của cùng một lớp.

Copy Constructor trong Java 

Copy Constructor cung cấp một bản sao của đối tượng được chỉ định bằng cách lấy đối số là đối tượng hiện có của cùng một lớp. Java không hoàn toàn cung cấp cơ sở của một phương thức khởi tạo Sao chép như trong ngôn ngữ C. Tuy nhiên, chúng ta có thể xác định nó bằng cách sao chép các giá trị của một đối tượng này sang một đối tượng khác.

Tạo hàm Copy Constructor trong Java

Để tạo một phương thức khởi tạo sao chép trong Java, trước tiên chúng ta cần khai báo một phương thức khởi tạo nhận một đối tượng cùng kiểu làm tham số. Ví dụ:

public class Student

{

        private int roll ;

        private String name;




        // Declaring a copy constructor by passing the parameter as the class

        public Student( Student student )

        {

        }

}

Sau khi khai báo hàm tạo sao chép, chúng ta cần sao chép mỗi tệp của đối tượng đầu vào của lớp trong đối tượng mới. Ví dụ:

 

public class Student

{

        private int roll;

        private String name;




        // Copying each field of the existing object into the newly created object

        public Student( Student student )

        {

                this.id = student.roll;

                this.name = student.name;

        }

}

Từ đoạn code trên, chúng ta tạo một bản sao chép nông của đối tượng. Nó sẽ hoạt động ổn định vì chúng ta đang sử dụng kiểu dữ liệu nguyên thủy và không thể thay đổi, như int và String.

Nếu chúng ta có kiểu dữ liệu có thể trong đổi trong chương trình Java, sau đó chúng ta có thể tạo ra bản sao sâu (deep) thay vì bản sao nông để đối tượng được tạo mới sẽ sẽ trở nên độc lập với đối tượng tồn tại. 

public class Student

{

        private int roll;

        private String name;

        private Date admissionDate;




        public Student( Student student )

        {

                this.roll = student.id;

                this.name = student.name;

                this.admissionDate = new Date(student.admissionDate.getTime());

        }

}

>>> Tham khảo: Khóa học Java Web Fullstack

Ví dụ về Copy Constructor trong Java

package com.techvidvan.copyconstructor;

public class Student 

{

  private int roll;

  private String name;




  //constructor to initialize roll number and name of the student

  Student(int rollNo, String sName)

  { 

    roll = rollNo;

    name = sName;

  }




  //copy constructor

  Student(Student student)

  {

    System.out.println("\n---Copy Constructor Invoked---");

    roll = student.roll;

    name = student.name;

  }

  //method to return roll number

  int printRoll()

  {

    return roll;

  }

//Method to return name of the student

  String printName()

  {

    return name;

  }

  //class to create student object and print roll number and name of the student




  public static void main(String[] args)

  {

    Student student1 = new Student(101, "Sneha");

    System.out.println("Roll number of the first student: "+ student1.printRoll());

    System.out.println("Name of the first student: "+ student1.printName());




    //passing the parameter to the copy constructor

    Student student2 = new Student(student1);




    System.out.println("\nRoll number of the second student: "+ student2.printRoll());

    System.out.println("Name of the second student: "+ student2.printName());

  }

}

 

Output

Roll number of the first student: 101

Name of the first student: Sneha

—Copy Constructor Invoked—

Roll number of the second student: 101

Name of the second student: Sneha

>>> Đọc thêm: Toán tử trong Java - Tìm hiểu các loại toán tử trong Java



Ưu điểm của Copy Constructor trong Java

Copy constructor trong Java có rất nhiều ưu điểm khuyến khích các lập trình viên sử dụng nó trong lập trình với Java. Cùng thảo luận về  những ưu điểm của Copy Constructor trong Java.

  • Sử dụng Copy Constructor dễ dàng hơn khi lớp của chúng ta chứa một đối tượng phức tạp với nhiều tham số.
  • Bất kỳ khi nào chúng ta muốn thêm tệp trong lớp, chúng ta có thể thực hiện điều đó bằng cách thay đổi hàm tạo.
  • Một trong những điểm quan trọng nhất của hàm tạo sao chép là lập trình viên không cần bất kỳ kiểu ép kiểu.
  • Hàm tạo Copy cho phép chúng ta thay đổi tệp được khai báo là final
  • Sử dụng copy constructor, chúng ta có thể hoàn toàn kiểm soát được việc tạo đối tượng. 

Tạo đối tượng Duplicate (Nhân bản) mà không cần sử dụng Copy Constructor trong Java

Chúng ta cũng có thể tạo bản sao đối tượng mà không cần sử dụng hàm tạo Copy, bằng cách chỉ định giá trị cả một đối tượng thành một đối tượng khác. Ví dụ:

package com.techvidvan.copyconstructor;

public class Student 

{

  private int roll;

  private String name;




  //constructor to initialize roll number and name of the student

  Student(int rollNo, String sName)

  { 

    roll = rollNo;

    name= sName;

  }

  

  Student()

  {  

  }




  //method to return roll number

  int printRoll()

  {

    return roll;

  }

  //Method to print name

  String printName()

  {

    return name;

  }

  //class to create student object and print roll number and name of the student




  public static void main(String[ ] args)

  {

    Student student1 = new Student(101, "Sneha");

    System.out.println("Roll number of the first student: "+ student1.printRoll());

    System.out.println("Name of the first student: "+ student1.printName());




    Student student2 = new Student();

    student2.roll= student1.roll;

    student2.name= student1.name;




    System.out.println("\nRoll number of the second student: "+ student2.printRoll());

    System.out.println("Name of the second student: "+ student2.printName());

  }

}

 

Output

Roll number of the first student: 101

Name of the first student: Sneha

Roll number of the second student: 101

Name of the second student: Sneha

 

So sánh Copy Constructor với phương thức clone() trong Java

Chúng ta cũng có thể sử dụng phương thức clone() để nhận bản sao chép của một đối tượng từ một đối tượng tồn tại trong lớp. Nhưng hàm tạo Copy sử dụng tốt hơn so với phương thức clone() vì một số lý do như sau:

  • Nó dễ thực thi và sử dụng hơn copy constructor trong Java. Vì khi sử dụng phương thức clone() để tạo đối tượng, chúng ta cần thực thi giao diện cloneable trong chương trình và cần giải quyết lỗi CloneNotSupported Exception. Trong hàm tạo Copy, không cần phải thực hiện những điều phức tạp này. 
  • Chúng ta cần ép kiểu đối tượng trở về bằng phương thức clone() tới thích hợp. Bạn không cần ép kiểu đối tượng khi sử dụng hàm tạo copy.
  • Khi chúng ta sử dụng phương thức clone(), chúng ta không thể chỉ định giá trị tới tệp final. Nhưng chúng ta có thể làm thế trong hàm tạo copy.

Các vấn đề về kế thừa 

Các lớp phụ và lớp con không thể mở rộng hàm tạo Copy. Nếu chúng ta cố khởi chạy một đối tượng con từ tham chiếu lớp mẹ, chúng ta sẽ gặp lỗi.

Để hiểu vấn đề này, chúng ta có thể tạo lớp phụ Student và hàm tạo copy của nó:

public class EngineeringStudent extends Student

{

private List<Student> performanceReport;

      // ... other constructors

 

      public EngineeringStudent(EngineeringStudent engineeringStudent)

{

            super(enggStudent.roll, enggStudent.name, enggStudent.admissionDate);

            this.performanceReport = performanceReport.stream().collect(Collectors.toList());

     }

}

Sau đó khai báo biến Student và khởi tạo nó bằng hàm tạo của lớp EngineeringStudent:

Student student = new EngineeringStudent (101, “Shreya:, entryDate, performanceReports);

Vì kiểu tham chiếu là của lớp Student, chúng ta cần ép kiểu nó thành kiểu EngineeringStudent để có thể sao chép hàm tạo cả lớp Student:

Student clone =new

EngineeringStudent ((EngineeringStudent)student)

Chúng ta có thể gặp lỗi ClassCastException tại thời điểm khởi chạy nếu đầu vào đối tượng không thuộc EngineeringStudent. Một cách để tránh ép  kiểu trong hàm copy là tạo phương thức kế thừa mới cho cả hai lớp. Ví dụ:

public class Student

{

public Student copy()

{

            return new Student(this);

      }

}

 

public class EngineeringStudent extends Student

{

@Override

      public Student copy() 

{

            return new EngineeringStudent(this);

      }

}

Kết luận:

Copy Constructor trong Java được sử dụng để tạo bản sao của đối tượng hiện tại của một lớp. Chúng ta có thể tạo một hàm tạo copy bằng cách truyền đối số như tên lớp của đối tượng chúng ta muốn tạo. Trong bài viết này, chúng ta đã tìm hiểu về Copy Constructor và một số ưu điểm của hàm tạo. Hy vọng bạn hiểu rõ hơn về Copy Constructor và có thể sử dụng chúng trong dự án của mình. Hy vọng các thông tin này hữu ích với bạn và đừng quên tìm hiểu thêm về Java và các ngôn ngữ lập trình khác qua các khóa học lập trình tại T3H