Guten Abend
Zu Übungszwecken bastle ich grad ein kleines Büchereiprojekt. Die Klasse Library sieht so aus (Wie die Klasse Book aussieht ist für meine Fragen wohl unerheblich):
Man ahnt es schon, es geht um das Speichern und Laden von Library-Objekten.
(Nebenbei-Frage:
ist die Methode toString() so okay, kommt mir ein wenig murksig vor, zudem warnt NetBeans "String concat in StringBuilder.append" - es funktioniert aber.)
EDIT: Die IDE-Warnung "String concat in StringBuilder.append" ist mir jetzt klar: das unterminiert die Effizienzsteigerung vom StringBuilder und ist deshalb dumm, gelle?!
Das Speichern und laden in der main-methode sieht so aus und funktioniert auch (man beachte meinen guten Büchergeschmack ):
Später einmal soll der Nutzer im Hauptproramm folgende Möglichkeiten haben:
- eine neue (leere) Library erstellen.
- eine gespeicherte Library Laden.
- ein neues Buch erstellen.
- einer im Arbeitsspeicher vorhandenen Library ein Buch hinzufügen.
- eine im Arbeitsspeicher vorhandene Library speichern.
So, jetzt die eigentlichen Fragen:
Der Nutzer soll immer nur ein Buch und eine Library bearbeiten können. Deshalb ist es wohl sinvoll, daß es in der main-methode auch nur eine Referenz vom Typ Library und eine vom Typ Book gibt. Richtig???
Des weiteren erscheint es mir sinnvoll, das ganze Speichern und Laden von Library-Objekten (einschliesslich es Dialogs) in Methoden der Klasse Library zu verpacken - Beim Laden wäre gar ein Konstruktor Library(filename) denkbar. Darf/kann/sollte denn ein bereits bestehendes Objekt einen Konstruktor der eigenen Klasse aufrufen, um sich quasi selbst durch das neue Objekt, das dieser Konstruktor erzeugt zu ersetzen?!?!? Oder ist das eh totaler Murks?!
Leider weiß ich also weder, ob a) diese Designidee sinnvoll bzw. möglich ist und b) wenn ja wie man das umsetzen soll.
Ich verbleibe wie immer in der Hoffnung, mich verständlich ausgedrückt zu haben und verharre in gespannter Erwartung auf eure Antworten.
Danke jedenfalls schon mal dafür, bis hierher gelesen zu haben!
EDIT2: Vlt. sollte man eine Klasse schreiben, die ein Objekt der Klasse Library enthält und die ganzen Schreib- und Leseaufgaen einschliesslich der Dialoge uind Überprüfungen erledigt?!?!
Zu Übungszwecken bastle ich grad ein kleines Büchereiprojekt. Die Klasse Library sieht so aus (Wie die Klasse Book aussieht ist für meine Fragen wohl unerheblich):
Java:
import java.io.Serializable;
import java.util.ArrayList;
public class Library implements Serializable{
private boolean unsavedChanges = false; //wird derzeit noch nicht benutzt...
private ArrayList<Book> books;
public Library() {
books = new ArrayList<Book>(100);
}
public void addBook(Book book){
books.add(book);
unsavedChanges = true;//wird derzeit noch nicht benutzt...
}
@Override
public String toString() {
StringBuilder result = new StringBuilder(10000);
for(Book b : books){
result.append(b.toString() +"\n");
}
return result.toString();
}
}
Man ahnt es schon, es geht um das Speichern und Laden von Library-Objekten.
(Nebenbei-Frage:
ist die Methode toString() so okay, kommt mir ein wenig murksig vor, zudem warnt NetBeans "String concat in StringBuilder.append" - es funktioniert aber.)
EDIT: Die IDE-Warnung "String concat in StringBuilder.append" ist mir jetzt klar: das unterminiert die Effizienzsteigerung vom StringBuilder und ist deshalb dumm, gelle?!
Das Speichern und laden in der main-methode sieht so aus und funktioniert auch (man beachte meinen guten Büchergeschmack ):
Java:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class Main {
public static void main(String[] args) {
Library l1 = new Library();
Library l2 ;
l1.addBook(new Book("Barthes, Roland", "Die Helle Kammer"));
l1.addBook(new Book("Luhmann, Niklas", "Soziale Systeme"));
l1.addBook(new Book("Carle, Eric", "Die Raupe Nimmersatt"));
l1.addBook(new Book("Dostojewski, Fjodor", "Schuld und Sühne"));
//speichern
try{
File file = new File("buecher.ser");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(l1);
fos.close();
}
catch(Exception e){
e.printStackTrace();
}
//laden
try {
FileInputStream fis = new FileInputStream("buecher.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
l2 = (Library) ois.readObject();
ois.close();
System.out.println(l2);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
- eine neue (leere) Library erstellen.
- eine gespeicherte Library Laden.
- ein neues Buch erstellen.
- einer im Arbeitsspeicher vorhandenen Library ein Buch hinzufügen.
- eine im Arbeitsspeicher vorhandene Library speichern.
So, jetzt die eigentlichen Fragen:
Der Nutzer soll immer nur ein Buch und eine Library bearbeiten können. Deshalb ist es wohl sinvoll, daß es in der main-methode auch nur eine Referenz vom Typ Library und eine vom Typ Book gibt. Richtig???
Des weiteren erscheint es mir sinnvoll, das ganze Speichern und Laden von Library-Objekten (einschliesslich es Dialogs) in Methoden der Klasse Library zu verpacken - Beim Laden wäre gar ein Konstruktor Library(filename) denkbar. Darf/kann/sollte denn ein bereits bestehendes Objekt einen Konstruktor der eigenen Klasse aufrufen, um sich quasi selbst durch das neue Objekt, das dieser Konstruktor erzeugt zu ersetzen?!?!? Oder ist das eh totaler Murks?!
Leider weiß ich also weder, ob a) diese Designidee sinnvoll bzw. möglich ist und b) wenn ja wie man das umsetzen soll.
Ich verbleibe wie immer in der Hoffnung, mich verständlich ausgedrückt zu haben und verharre in gespannter Erwartung auf eure Antworten.
Danke jedenfalls schon mal dafür, bis hierher gelesen zu haben!
EDIT2: Vlt. sollte man eine Klasse schreiben, die ein Objekt der Klasse Library enthält und die ganzen Schreib- und Leseaufgaen einschliesslich der Dialoge uind Überprüfungen erledigt?!?!
Zuletzt bearbeitet: