Reputation: 941
I have read Head First OOAD first chapter it has Guitar example,
Guitar Class
public class Guitar {
private String serialNumber;
private double price;
private String model;
private Type type;
private Builder builder;
private Wood backWood;
private Wood topWood;
}
In above class Builder, Wood and Type are enum types. An Inventory class has list of Guitar and provide add, search and get methods.
Inventory Class
class Inventory {
List<Guitar> guitarList;
public Inventory() {
guitarList = new ArrayList<Guitar>();
}
public boolean addGuitar(Guitar guitar){
return guitarList.add(guitar);
}
public Guitar getGuitar(Guitar guitar) {
for(Guitar guitarData : guitarList ) {
if(guitarData.getSerialNumber().equals(guitar.getSerialNumber())){
return guitarData;
}
}
return null;
}
public List<Guitar> search(Guitar guitar) {
List<Guitar> list = new ArrayList<Guitar>();
for(Guitar guitarData : guitarList ) {
if(guitar.getBuilder() == null || !guitar.getBuilder().equals(guitarData.getBuilder())) {
continue;
}
if(guitar.getTopWood() == null || !guitar.getTopWood().equals(guitarData.getTopWood())) {
continue;
}
if(guitar.getBackWood() == null || !guitar.getBackWood().equals(guitarData.getBackWood())) {
continue;
}
if(guitar.getType() == null || !guitar.getType().equals(guitarData.getType())) {
continue;
}
if(guitar.getModel() == null || !guitar.getModel().equals(guitarData.getModel())) {
continue;
}
list.add(guitarData);
}
return list;
}
}
In book, create another class GuitarSpec for search method in inventory because in this method client never provide serial Number and price for Guitar.
Updated Classes :
Guitar Class
class Guitar {
private String serialNumber;
private double price;
private GuitarSpec guitarSpec;
public String getSerialNumber() {
return serialNumber;
}
public double getPrice() {
return price;
}
public GuitarSpec getGuitarSpec() {
return guitarSpec;
}
}
Guitar Spec Class :
class GuitarSpec {
private String model;
private Type type;
private Builder builder;
private Wood backWood;
private Wood topWood;
public String getModel() {
return model;
}
public Type getType() {
return type;
}
public Builder getBuilder() {
return builder;
}
public Wood getBackWood() {
return backWood;
}
public Wood getTopWood() {
return topWood;
}
}
and Change in Inventory class search method,
public List<Guitar> search(GuitarSpec searchSpec) {
List<Guitar> list = new ArrayList<GuitarSpec>();
for(Guitar guitar : guitarList ) {
GuitarSpec guitarSpec = guitar.getGuitarSpec();
if(searchSpec.getBuilder() == null || !searchSpec.getBuilder().equals(guitarSpec.getBuilder())) {
continue;
}
if(searchSpec.getTopWood() == null || !searchSpec.getTopWood().equals(guitarSpec.getTopWood())) {
continue;
}
if(searchSpec.getBackWood() == null || !searchSpec.getBackWood().equals(guitarSpec.getBackWood())) {
continue;
}
if(searchSpec.getType() == null || !searchSpec.getType().equals(guitarSpec.getType())) {
continue;
}
if(searchSpec.getModel() == null || !searchSpec.getModel().equals(guitarSpec.getModel())) {
continue;
}
list.add(guitar);
}
return list;
}
I am not understanding why new GuitarSpec is Created, As per oops is this required ?
Upvotes: 2
Views: 784
Reputation: 3189
This is because every guitar has a spec.but not every spec has/is a guitar
But when you are searching for a guitar with a certain spec,
you will basically compare the spec of every guitar with the spec you are searching for.
But you will not be searching for serial numbers and price.
this way you can use the guitarspec class withuit having to create a guitar
Upvotes: 2