Java におけるコピーコンストラクタの作成

JavaBeginner
オンラインで実践に進む

はじめに

この実験では、Java でコピーコンストラクタを作成する方法を学びます。コピーコンストラクタは、既存のオブジェクトの値を使用して新しいオブジェクトを作成するために使用されます。コピーコンストラクタは、シャロークローンとディープクローンの両方を作成するために使用できます。単純なクラスと参照型を持つクラスのコピーコンストラクタを作成します。

単純なクラスを作成する

名前と GPA フィールドを持つ単純な Student クラスを作成します。このクラスを使用してコピーコンストラクタを作成します。

class Student {
 private String name;
 private double gpa;

 // パラメータ付きコンストラクタ
 Student(String name, double gpa) {
  this.name = name;
  this.gpa = gpa;
    }
}

単純なクラス用のコピーコンストラクタを作成する

Student クラスのコピーコンストラクタを作成します。コピーコンストラクタは、クラスのオブジェクトを入力として受け取り、入力オブジェクトの値を使用してフィールドを初期化する必要があります。

// コピーコンストラクタ
Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
}

// ゲッター
public String getName() {
 return name;
}

public double getGpa() {
 return gpa;
}

オブジェクトを作成してクローンする

Student クラスのオブジェクトを作成し、その後、コピーコンストラクタを使用してそのオブジェクトのクローンを作成します。元のオブジェクトの名前を変更し、両方のオブジェクトの名前を出力して、クローンされたオブジェクトが影響を受けたかどうかを確認します。

Student s = new Student("John", 3.5);
Student s2 = new Student(s);

s.setName("Sarah");

System.out.println("Original: " + s.getName());
System.out.println("Clone: " + s2.getName());

参照型を持つクラスを作成する

参照型(Address)をフィールドとして含む Student クラスを作成します。このクラスを使用して、シャロークローンとディープクローンの違いを示します。

class Student {
 private String name;
 private double gpa;
 private Address address;

 // パラメータ付きコンストラクタ
 Student(String name, double gpa, Address address) {
  this.name = name;
  this.gpa = gpa;
  this.address = address;
 }
}

class Address {
 private int postalCode;

 Address(int postalCode) {
  this.postalCode = postalCode;
    }
}

シャローコピーコンストラクタを作成する

Student クラスのシャローコピーコンストラクタを作成します。シャローコピーコンストラクタは、参照型のフィールドに対しては参照のみを割り当てる必要があります。

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = s.getAddress();
}

シャロークローニングを示す

Student オブジェクトを作成し、その後、シャローコピーコンストラクタを使用してクローンを作成します。元のオブジェクトの住所の郵便番号を変更し、両方の郵便番号を出力して、クローンされたオブジェクトが元のオブジェクトの変更の影響を受けることを示します。

Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);

s.getAddress().setPostalCode(54321);

System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());

ディープコピーコンストラクタを作成する

Student クラスのディープコピーコンストラクタを作成します。ディープコピーコンストラクタは、参照型のフィールドに対して新しいオブジェクトを作成する必要があります。

Student(Student s) {
 this.name = s.getName();
 this.gpa = s.getGpa();
 this.address = new Address(s.getAddress().getPostalCode());
}

// ゲッター
public Address getAddress() {
 return address;
}

ディープクローニングを示す

Student オブジェクトを作成し、その後、ディープコピーコンストラクタを使用してクローンを作成します。元のオブジェクトの住所の郵便番号を変更し、両方の郵便番号を出力して、クローンされたオブジェクトが元のオブジェクトの変更の影響を受けないことを示します。

Student s = new Student("John", 3.5, new Address(12345));
Student s2 = new Student(s);

s.getAddress().setPostalCode(54321);

System.out.println("Original: " + s.getAddress().getPostalCode());
System.out.println("Clone: " + s2.getAddress().getPostalCode());

まとめ

この実験では、Java においてコピーコンストラクタを作成する方法を学びました。コピーコンストラクタは、オブジェクトのディープクローンとシャロークローンを作成するために使用できます。また、コピーコンストラクタと clone() メソッドを比較し、コピーコンストラクタに関する継承の問題についても議論しました。コピーコンストラクタを作成することは、オブジェクトをクローンするエレガントで簡単な方法です。