まず、Printer クラスを定義します。
package com.ggl.modeltest;
public class Printer {
private String companyName;
private String printerName;
public Printer(String companyName, String printerName) {
this.companyName = companyName;
this.printerName = printerName;
}
public String getCompanyName() {
return companyName;
}
public String getPrinterName() {
return printerName;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((companyName == null) ? 0 : companyName.hashCode());
result = prime * result
+ ((printerName == null) ? 0 : printerName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Printer other = (Printer) obj;
if (companyName == null) {
if (other.companyName != null)
return false;
} else if (!companyName.equals(other.companyName))
return false;
if (printerName == null) {
if (other.printerName != null)
return false;
} else if (!printerName.equals(other.printerName))
return false;
return true;
}
public Printer copy() {
return new Printer(companyName, printerName);
}
}
このクラスには、値を定義するためのコンストラクターと、値を取得するための 2 つの getter メソッドがあります。このクラスのインスタンスを作成すると、それを変更することはできません。
これらのタイプの変更不可能なクラスにより、デバッグが簡単になります。
hashCode と equals メソッドはかなり恐ろしく見えます。私はEclipseにそれらのメソッドを生成させました。これらのメソッドをオーバーライドする理由は、それらをComputer
クラスで使用するためです。
それでは、Computer
クラスを定義します。
package com.ggl.modeltest;
import java.util.ArrayList;
import java.util.List;
public class Computer {
private List<Printer> printerNames;
private String computerName;
public Computer(String computerName) {
this.computerName = computerName;
this.printerNames = new ArrayList<Printer>();
}
public void addPrinter(Printer printerName) {
this.printerNames.add(printerName);
}
public void removePrinter(Printer printerName) {
for (int i = printerNames.size() - 1; i >= 0; i--) {
if (printerNames.get(i).equals(printerName)) {
printerNames.remove(i);
}
}
}
public List<Printer> getPrinterNames() {
return printerNames;
}
public String getComputerName() {
return computerName;
}
}
コンストラクターは、コンピューターの名前を取ります。インスタンスが構築されると、コンピューターの名前を変更する方法はありません。
コンピューターにプリンターを追加したり、コンピューターから削除したりします。コンピューターにプリンターを追加する方法と、コンピューターからプリンターを削除する方法の 2 つが定義されています。
remove メソッドは、複数のプリンターが入力された場合に、プリンターのすべてのインスタンスを から削除しますList
。
プリンター リストを取得するメソッドは、 のインスタンスを返しますList
。呼び出しプログラムは、このリストの内容を変更できます。呼び出し元のプログラムがリストの内容を変更できないようにする場合は、List
.
ディープ コピーを作成するには、Printer
クラスのコピー メソッドを記述します。
public Printer copy() {
return new Printer(companyName, printerName);
}
文字列は変更できないため、文字列のコピーを作成する必要はありません。変更可能な値がある場合は、それらのコピーも作成する必要があります。そのため、これはディープ コピーと呼ばれます。最初にすべてを正しくコピーするのは難しい場合があります。そのためのテストです。
getPrinterNames
次に、Computer
クラスのメソッド内のループでこのコピー メソッドを呼び出します。
public List<Printer> getPrinterNames() {
List<Printer> list = new ArrayList<Printer>();
for (Printer printer : printerNames) {
list.add(printer.copy());
}
return list;
}