Листинг 4.1. Класс Cartltem (cartltem.java) [Все представленные в книге тексты программ можно найти на сайте издательства по адресу www.piter.com. — Примеч. ред. ]
package com.XmlEcomBook.catalog;
import java.util.* ;
import java.io.* ;
import org.xml.sax.* ;
import org.w3c.dom.* ;
public class CartItem implements java.io.Serializable
{ // be sure to change this if substantive variables change
static final long serialVersionUID = 3260689382642549142L;
// these are set from the constructor
private String id ; // from product element
private String name ; // from name element
private String price ; // from price element
private String shippingType ; // from shipping_info element
private String shippingValue ; // may be null if type is special
// these may change
private int numberOrdered ; // changes
public String getId(){ return id ;}
public String getName(){ return name ; }
public String getPrice() { return price ; }
public String getShippingType() { return shippingType ; }
public String getShippingValue() { return shippingValue ; }
public int getNumberOrdered(){ return numberOrdered ; }
public void setId(String s){ id = s ; }
public void setName(String s){ name = s; }
public void setPrice(String s){ price = s ;}
public void setShippingType(String s ){shippingType = s ;}
public void setShippingValue(String s) { shippingValue = s ;}
public void setNumberOrdered( int n ){ numberOrdered = n ;
System.out.println("setNumberOrdered " + n );
}
// needed for operation as a Bean
public CartItem(){
}
// constructor uses a <product> org.w3c.dom.Element
public CartItem( Element pe ){
id = pe.getAttribute("id");
NodeList nl = pe.getElementsByTagName( "name" );
name = nl.item(0).getFirstChild().getNodeValue() ;
nl = pe.getElementsByTagName( "price" );
price = nl.item(0).getFirstChild().getNodeValue() ;
nl = pe.getElementsByTagName( "shipping_info" );
Element ship = (Element) nl.item(0);
shippingType = ship.getAttribute("type");
shippingValue = ship.getAttribute("value"); // may be ""
}
// handy for debugging
public String toString() {
StringBuffer sb = new StringBuffer("CartItem name:");
sb.append( name ); sb.append(" numberOrdered: ");
sb.append( Integer.toString( numberOrdered ));
return sb.toString();
}
}
Класс ShoppingCart достаточно прост, так как все, что от него требуется, — манипулирование объектами класса Cartltem. Как показано в листинге 4.2, мы храним ссылки на объекты Cartltem в двух местах — Vector и HashTable. Причина этого заключается в том, что порядок размещения ссылок в объекте HashTable непредсказуем и может меняться по мере добавления новых товаров. Представляется разумным хранить эти ссылки в предсказуемой и воспроизводимой последовательности в объекте Vector и в то же время иметь возможность доступа к товарам по их идентификаторам через хэш-таблицу.
Заметим, что класс ShoppingCart реализует интерфейс Serializable, так что вся корзина (то есть объект класса Shoppi ngCart) может пересылаться между программами Java или записываться в файл посредством сериализации.