首先,让我们定义一个 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);
}
}
这个类有一个构造函数来定义值,以及两个 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;
}
}
构造函数采用计算机的名称。一旦构造了实例,就无法更改计算机的名称。
打印机被添加到计算机和从计算机中移除。定义了两种方法来将打印机添加到计算机和从计算机中删除打印机。
List
如果输入了多个,则 remove 方法会从 中删除打印机的所有实例。
获取打印机列表的方法返回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;
}