Java: Collections & Serialisierung
18.06 2008 10:02
Für die fleißigen unter uns gibt es hier noch die letzen beiden Java-Aufgaben.
Aufgabe 7: hier soll die Set-Datenstruktur unserer Artikelverwaltung durch eine Hash-Map ersetzt, sowie ein Protokoll zur Überwachung der Kundenaktionen erstellt werden.
Aufgabe 8: hier wird nun unser Programm so erweitert, dass die Kunden, Mitarbeiter und Artikel extern gespeichert werden können.
Aufgabe 7
Hash-Map
Wir sollen hier die Set-basierte Verwaltung von Artikeln durch eine Hash-Map ersetzen.
Deshalb öffnen wir das Buch der Videothek und ändern gleich mal was.
private Set artikelListe = new Set(2);
wird nun zu
private HashMap artikelMap = new HashMap();
Nun müssen wir nur noch die Methoden addArticle, deleteArticle und findArticle überarbeiten.
public void addArticle(Artikel article)
{
article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
artikelListe.add(article);
}
wird zu
public void addArticle(Artikel article)
{
article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
artikelMap.put(article.getArtikelNummer(), article);
}
public void deleteArticle(String articleNr)
{
for(int c = 0; c < artikelListe.getLength(); c++){
if(artikelListe.get(c).equals(findArticle(articleNr))){
artikelListe.rem(c);
break;
}
}
}
wird zu
public void deleteArticle(String articleNr)
{
artikelMap.remove(articleNr);
}
und
public Artikel findArticle(String articleNr){
Artikel ret = null;
for(int c = 0; c < artikelListe.getLength(); c++){
if(((Artikel) artikelListe.get(c)).getArtikelNummer().equalsIgnoreCase(articleNr)){
ret = (Artikel) artikelListe.get(c);
break;
}
}
return ret;
}
wird zu
public Artikel findArticle(String articleNr){
return artikelMap.get(articleNr);
}
Nur noch die Methode listArtikel anpassen
public void listArtikel() throws ExistException
{
System.out.println("| Artikel Nr | ArtikelTyp | Beschreibung | Anzahl auf Lager | Zusatzinfo |");
System.out.println("+------------------+------------+---------------------------------------+-------------------+-------------------+");
if(artikelMap.isEmpty()) throw new ExistException("Keine Artikel vorhanden");
data = artikelMap.values();
it = data.iterator();
Artikel tmp;
while( it.hasNext() ) {
tmp = (Artikel) it.next();
String z = tmp.getArtikelNummer();
String y = "Artikel Nr ";
z = fitTable(z, y.length(), ' ');
System.out.println("| " + z + tmp.toString());
}
}
und fertig ist der Umstieg auf die Hash-Map!
Protokoll
Um die Aktionen unserer Kunden nachvollziehen zu können müssen wir jetzt ein Protokoll bauen.
Die Protocoll-Entry-Klasse
Zuerst einen Protokoll-Eintrag:
public class ProtocollEntry {
private String protocollTyp;
private String descriptiveText;
private String zeitspempel;
private Calendar time = Calendar.getInstance();
public ProtocollEntry(String protocollTyp, String descriptiveText) {
this.descriptiveText =descriptiveText;
this.protocollTyp=protocollTyp;
zeitspempel = "" + time.getTime();
}
public String toString(){
return "_" + zeitspempel + " _" + protocollTyp + " (" + descriptiveText+ ")";
}
}
Die Klasse Protocoll
Hier werden die Protokoll-Einträge eines Kunden verwaltet:
public class Protocoll {
private Vector list = new Vector();
private ProtocollEntry tmp;
private Iterator it;
public void writeProtocollEntry( String protocollTyp, String descriptiveText){
tmp = new ProtocollEntry(protocollTyp, descriptiveText);
list.add(tmp);
}
public void listProtocollEntry(){
it = getProtocollIterator();
while(it.hasNext()){
tmp = it.next();
System.out.println(tmp.toString());
}
}
public Iterator getProtocollIterator(){
Iterator it = list.iterator();
return it;
}
}
Testen
public class Testsuite {
public static void main(String[] args){
Videothek video = new Videothek();
Zeitgeber fatherTime = Zeitgeber.getInstance();
fatherTime.setZeitfortschritt(1);
Timer timer = new Timer();
timer.scheduleAtFixedRate( fatherTime , 1000, 100);
/***************************************
* Kundenerstellung
***************************************/
PrivatKunde Kunde1 = new PrivatKunde("Franz", "Huber");
FirmenKunde Kunde2 = new FirmenKunde("Google" , "Corporation");
/***************************************
* Artikelerstellung
***************************************/
CD article1 = new CD("Pink Floyd","Pink Floyd, Another Brick in the Wall", 2);
DVD article2 = new DVD("Dinofilm","In Einem Land vor unserer Zeit", 5, 0);
SWEET article3 = new SWEET("Kaugummi","Kirsch-Geschmack", 20, "5Tage");
/***************************************
* Administrator Test
***************************************/
AdministrationsSicht admin = video;
admin.addArticle(article1);
admin.addArticle(article2);
admin.addArticle(article3);
admin.addKunde(Kunde1);
admin.addKunde(Kunde2);
KundenLogin videothek = video;
KundenSicht kSicht;
kSicht = videothek.login(Kunde1.getKundenNr());
kSicht.listArticle();
kSicht.borrowArticle(article1.getArtikelNummer());
kSicht.buyArticle(article3.getArtikelNummer());
kSicht.logOff();
Kunde1.showProtocoll();
}
}
Aufgabe 8
Zuerst übernehmen wir das geforderte Interface PersistenceLayer aus der Aufgabenstellung:
public interface PersistenceLayer {
public void saveKunde( Kunde kunde ) throws VideothekException;
public void deleteKunde( String kundenNr) throws VideothekException;;
public Kunde loadKunde( String kundenNr ) throws VideothekException;;
public List listAllCustomerNumbers() throws VideothekException;
public void saveMitarbeiter( Mitarbeiter mitarbeiter ) throws VideothekException;
public void deleteMitarbeiter( String mitarbeiterNr ) throws VideothekException;
public Mitarbeiter loadMitarbeiter( String mitarbeiterNr ) throws VideothekException;
public List listAllMitarbeiterNumbers() throws VideothekException;
public void saveArtikel( Artikel artikel ) throws VideothekException;
public void deleteArtikel( String artikelNr ) throws VideothekException;
public Artikel loadArtikel( String artikelNr ) throws VideothekException;
public List listAllArtikelNumbers() throws VideothekException;
}
Anschließend erstellen wir eine neue Klasse in der wir das Interface PersistenceLayer implementieren.
public class DataHandler implements PersistenceLayer{
...
}
noch eine wichtige variable hinzufügen...
private final char seperator = File.separatorChar;
Nur noch die fehlenden Methoden... (hier: nur Artikel - analog für Mitarbeiter und Kunden)
public void saveArtikel(Artikel artikel) throws VideothekException {
File f = new File(System.getProperty("user.dir")+seperator+"artikel");
if(!f.exists()) f.mkdir();
try{
FileOutputStream fos = new FileOutputStream("."+seperator+"artikel"+seperator+artikel.getArtikelNummer());
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(artikel);
os.close();
} catch (IOException e){
System.out.println(e.toString());
}
}
public void deleteArtikel(String artikelNr) throws VideothekException {
File f = new File(System.getProperty("user.dir")+seperator+"artikel"+seperator+artikelNr);
f.delete();
}
public List listAllArtikelNumbers() throws VideothekException {
File f = new File(System.getProperty("user.dir")+seperator+"artikel");
return arrayToList(f.list());
}
(Die Methode arrayToList wandelt ein String-Array in eine Liste aus Strings um)
public void saveArtikel(Artikel artikel) throws VideothekException {
File f = new File(System.getProperty("user.dir")+seperator+"artikel");
if(!f.exists()) f.mkdir();
try{
FileOutputStream fos = new FileOutputStream("."+seperator+"artikel"+seperator+artikel.getArtikelNummer());
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(artikel);
os.close();
} catch (IOException e){
System.out.println(e.toString());
}
}
Noch bei den Klassen wie Artikel etc. ein implements Serializable hinzufügen dass man diese schön speichern kann.
public Artikel loadArtikel(String artikelNr) throws VideothekException {
Artikel ret = null;
try {
FileInputStream fis = new FileInputStream("."+seperator+"artikel"+seperator+artikelNr);
ObjectInputStream is = new ObjectInputStream(fis);
ret = (Artikel)is.readObject();
is.close();
} catch (IOException e) {
} catch (ClassNotFoundException e) {
}
return ret;
}
Da nun alles wichtige implementiert wurde, müssen wir nur noch die neuen Funktionen in unser Programm einbauen. Hier: dataHandler.saveArtikel(article);
public void addArticle(Artikel article)
{
article.setArtikelNummer(generateArticleNumber(article.getArtikelTyp()));
artikelMap.put(article.getArtikelNummer(), article);
try {
dataHandler.saveArtikel(article);
} catch (VideothekException e) {
System.out.println(e.toString());
}
}
Den Rest kann man analog schreiben. Aber das überlass ich jetzt euch ;) Viel Spaß :)
Kommentare
- Noch keine Kommentare vorhanden.
- Dieser Eintrag kann nicht mehr kommentiert werden.
