Einführung
Eine gemeinschaftliche Werkzeugausgabe verleiht echte Werkzeuge an registrierte Mitglieder. Zwei Bohrmaschinen können denselben Namen haben und dennoch zu unterschiedlichen Ausleihen gehören. Ein Werkzeug in Wartung muss weiterhin nicht ausleihbar sein. Ein ausgeliehenes Werkzeug darf nur die eingetragene Person zurückgeben.
Du verankerst diese Regeln in einem Java-Objekt und verwendest anschließend eine vorbereitete kleine Befehlsschleife. Dieses erste Lab hält Änderungen im Arbeitsspeicher; das nächste behandelt das Speichern. Java-Klassen, Methoden, private Felder, Listen und grundlegende Ausnahmen solltest du bereits kennen. Vom Autor geschätzte Lese- und Übungszeit: 45 Minuten.
Ein Werkzeug ausleihen, ohne seine Identität zu verlieren
In diesem Schritt führst du eine normale Ausleihe aus, liest das vorbereitete Objekt und ergänzt die kleine Regel, die es vor einer zweiten Ausleihe schützt.
Öffne den Tab Terminal. cd wählt den Projektordner aus; alle späteren Shell-Befehle dieses Labs beginnen dort. Ist eine falsch eingegebene Zeile noch nicht ausgeführt, lösche sie mit Ctrl+U und gib sie erneut ein. Bei „file not found“ führe dieses cd erneut aus, statt die Umgebung zurückzusetzen.
cd /home/labex/project/tool-library
Die vorbereitete Anwendung lässt sich bereits kompilieren. javac ist der Java-Compiler, -encoding UTF-8 legt die Quelltextkodierung fest, -d out legt die kompilierten Klassen in out ab und *.java wählt die Java-Quelldateien in diesem Ordner aus.
javac -encoding UTF-8 -d out *.java
Bei erfolgreicher Kompilierung erscheint keine Ausgabe. Kompiliere nach Änderungen vor jedem Start erfolgreich; sonst könnte Java alte Klassen ausführen. java startet das Programm, -Dfile.encoding=UTF-8 legt seine Textkodierung fest, -cp out wählt die kompilierten Klassen aus und Desk ist die Einstiegsklasse. desk.tsv liefert die Datensätze; --memory schaltet das Speichern in diesem Lab aus.
java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory
Du befindest dich im Programm der Werkzeugausgabe, nicht in der Shell. Gib jede Zeile ein und drücke Enter:
borrow A11 M01
list
quit
Erwartet wird Accepted: A11 BORROWED M01. A12 ist eine weitere Drill, bleibt aber AVAILABLE: Die ID kennzeichnet ein physisches Werkzeug, während sein Name mehrfach vorkommen darf. quit führt zur Shell zurück. Diese normale Ausleihe funktioniert bereits vor der Reparatur, doch der Code verhindert noch keine erneute Ausleihe desselben Werkzeugs. Weil dieser Lauf --memory verwendet hat, bleibt die ursprüngliche Datei unverändert und der nächste Lauf beginnt von vorn.
Lies den vorbereiteten Quelltext mit cat. Der Befehl zeigt eine Datei an, ohne sie zu bearbeiten:
cat Tool.java
Ein Werkzeug speichert eine stabile id, einen angezeigten name, einen state, einen borrower und eine note. Ein enum hat eine feste Menge benannter Werte: AVAILABLE bedeutet, dass niemand das Werkzeug hat, BORROWED, dass ein Mitglied es hat, und MAINTENANCE sperrt die Ausleihe. Der Strich - steht für keine ausleihende Person. Die privaten Felder lassen sich nur durch Methoden ändern. Lies borrow: Die Methode weist derzeit BORROWED und ein neues Mitglied zu, ohne den bisherigen Zustand zu prüfen. Sage voraus, was eine zweite Ausleihe überschreiben würde. Konstruktor, Getter und Enum sind bereits vollständig; erhalte sie.
Auch das Befehlsgerüst ist vorbereitet:
cat Desk.java
Suche den Aufruf found.borrow(c[2]) und den umgebenden try/catch-Block. Die Schleife prüft, ob eine Mitglieds-ID existiert, doch ein Tool muss seinen eigenen Zustand schützen. Eine IllegalArgumentException wird zu Rejected: ..., und die Schleife bleibt geöffnet. Die Zustandsprüfung muss vor beiden Zuweisungen erfolgen; eine Ausnahme nach einer Änderung würde eine abgewiesene Ausleihe teilweise wirksam lassen.
Erstelle vor dem Bearbeiten eine reine Quelltextsicherung. mkdir -p erstellt bei Bedarf einen Ordner; cp kopiert eine Datei. Das sind deine eigenen Sicherungsdateien, keine fertigen Lösungen. Kopiere die Ausgabe- und Mitgliedsdaten nicht und setze sie nicht zurück.
mkdir -p work
cp Tool.java work/Tool-before-borrow.java.txt
Öffne die vorhandene Datei in nano, einem Texteditor im Terminal:
nano Tool.java
In nanos Tastenkürzelleiste bedeutet ^ Ctrl. Halte Ctrl gedrückt und drücke die andere Taste; gib das Zirkumflexzeichen nicht ein. Drücke Ctrl+W, gib state = State.BORROWED; ein und drücke Enter, um die Zuweisung in borrow zu finden. Ctrl+A führt zum Anfang dieser Zeile. Positioniere den Cursor mit den Pfeiltasten und korrigiere Zeichen mit Backspace. Füge diese Schutzbedingung oberhalb der Zuweisung ein und lasse die beiden vorhandenen Zuweisungen sowie den Rest der Klasse bestehen:
if (state != State.AVAILABLE) {
throw new IllegalArgumentException("Tool is not available");
}
Hier bedeutet != „ist nicht gleich“. Die Bedingung weist sowohl eine bestehende Ausleihe als auch Wartung ab; Identität, Name und Notiz bleiben unverändert. Schreibe die Verzweigung in deine vorhandene Methode, statt die Klasse zu ersetzen. Prüfe geschweifte Klammern und Semikolon.
Drücke Ctrl+O zum Speichern, Enter zum Bestätigen des vorhandenen Dateinamens und dann Ctrl+X zum Beenden. Um stattdessen einen ungespeicherten Fehler zu verwerfen, drücke Ctrl+X und antworte an der Speicherabfrage mit N. Öffne die Datei für einen neuen Versuch erneut. In der Shell öffnet nano Tool.java sie wieder; Ctrl+W findet dieselbe Ankerstelle. Lies bei einem Compilerfehler Datei und Zeile, korrigiere diese Stelle in nano, speichere und kompiliere erneut. Starte nach einer fehlgeschlagenen Kompilierung nicht.
Falls du alle Quelltextänderungen dieses Schritts rückgängig machen musst, stellt der folgende Wiederherstellungsbefehl nur deine frühere Sicherung von Tool.java wieder her. Diese Änderungen gehen dabei verloren. Verwende ihn daher nur, wenn du diese Quelltextbearbeitung bewusst neu beginnen möchtest; Daten setzt er niemals zurück. Dies ist eine Wiederherstellungsoption, kein regulärer nächster Schritt:
cp work/Tool-before-borrow.java.txt Tool.java
Nachdem du die Schutzbedingung gespeichert hast, gegebenenfalls nach der Wiederherstellung erneut, kompiliere und starte:
javac -encoding UTF-8 -d out *.java
java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory
Gib diese Ausgabebefehle der Reihe nach ein:
borrow A11 M01
list
borrow A11 M02
borrow A13 M01
borrow TYPO M01
borrow A12 M02
list
quit
Die erste Ausleihe gelingt. Die doppelte Ausleihe und die Ausleihe des Wartungswerkzeugs werden absichtlich mit Rejected: Tool is not available abgewiesen. TYPO führt zur Ablehnung wegen einer unbekannten ID; korrigiere die ID in der nächsten Zeile, ohne die Umgebung zurückzusetzen. A12 kann weiterhin unabhängig an M02 ausgeliehen werden. Die abschließende Liste muss A11 → M01 sowie Wartungszustand und Notiz von A13 erhalten. quit führt zur Shell zurück; desk.tsv bleibt unverändert. Die Rückgabemethode ist noch unvollständig und wird im nächsten Schritt bearbeitet.
Nur der eingetragenen Person die Rückgabe erlauben
In diesem Schritt vervollständigst du den umgekehrten Zustandswechsel und erhältst die übrigen Ausleihen.
Beginne am Shell-Prompt im selben Tab Terminal. Eine Rückgabe ist nur aus BORROWED zulässig und nur dann, wenn das angegebene Mitglied mit borrower übereinstimmt. Bei Java-Zeichenketten vergleicht .equals() den Inhalt; ! kehrt dieses Vergleichsergebnis um. Sind beide Prüfungen bestanden, setze den Zustand auf AVAILABLE und lösche die ausleihende Person durch -. Wird die Ausnahme zuerst ausgelöst, kann eine fehlgeschlagene Rückgabe das Objekt nicht teilweise verändern.
Erhalte deine Schutzbedingung für die Ausleihe. Erstelle vor der nächsten Änderung eine neue reine Quelltextsicherung, damit eine Wiederherstellung die fertige Ausleihmethode erhält:
cp Tool.java work/Tool-before-return.java.txt
nano Tool.java
Drücke Ctrl+W, suche nach state = State.AVAILABLE; und drücke Enter. Das ist die erste Zuweisung in giveBack. Ctrl+A führt zum Zeilenanfang. Füge die beiden folgenden Prüfungen davor ein; erhalte die vorhandene Zustandszuweisung und borrower = "-"; nach beiden Prüfungen. Ersetze weder die Klasse noch entferne die Schutzbedingung für die Ausleihe.
if (state != State.BORROWED) {
throw new IllegalArgumentException("Tool is not borrowed");
}
if (!borrower.equals(member)) {
throw new IllegalArgumentException("Borrower does not match");
}
Die erste Verzweigung weist ein verfügbares Werkzeug oder eines in Wartung ab. Nur ein ausgeliehenes Werkzeug erreicht die Identitätsprüfung. Vergleiche das Mitglied mit der eingetragenen ausleihenden Person, nicht mit einem Anzeigenamen. Prüfe die geschweiften Klammern und drücke dann Ctrl+O, Enter, Ctrl+X zum Speichern und Beenden. Einen ungespeicherten Fehler verwirfst du mit Ctrl+X, N. Behebe Compilerfehler, indem du die Datei erneut öffnest und die betreffende Methode suchst; kompiliere vor dem Start erfolgreich. Um die Änderungen dieses Schritts bewusst zu verwerfen und dabei die Schutzbedingung für die Ausleihe zu erhalten, verwende cp work/Tool-before-return.java.txt Tool.java und wiederhole nur die Rückgabeänderung. Stelle nicht die ältere Sicherung vor der Ausleihänderung wieder her.
Kompiliere erneut, damit das Programm den aktuellen Quelltext verwendet, und öffne anschließend eine neue Ausgabe im Arbeitsspeicher. In diesem Lab beginnt jeder Lauf mit der ursprünglichen Datei.
javac -encoding UTF-8 -d out *.java
java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory
Gib diese Ausgabebefehle der Reihe nach ein:
list
return A14 M01
return A13 M03
return A14 M03
borrow A14 M02
list
quit
Die erste Liste zeigt die vorhandene Ausleihe A14 → M03. Die falsche Person erhält Rejected: Borrower does not match. Die Rückgabe des Werkzeugs in Wartung ergibt Rejected: Tool is not borrowed. Keine der beiden Ablehnungen verändert das Objekt. Die richtige Rückgabe ergibt Accepted: A14 AVAILABLE -; danach kann M02 das Werkzeug ausleihen. A13 bleibt in Wartung; A11 und A12 behalten getrennte IDs und Notizen.
Du hast zwei erlaubte Übergänge ausgedrückt: AVAILABLE → BORROWED und BORROWED → AVAILABLE. Aus MAINTENANCE gibt es keinen Rückgabeübergang. Diese Anwendung bietet keinen Befehl zur Wartungsverwaltung. Eine Ablehnung ist ein normales Geschäftsergebnis; sie beendet die Befehlsschleife nicht. Du kannst das Programm zum Üben erneut starten. Änderungen verschwinden in diesem Lab absichtlich nach quit. Behalte deinen Quelltext und fahre mit dem unabhängigen Persistenz-Lab fort, um zu lernen, warum.
Zusammenfassung
Du hast ein Enum und privaten Objektzustand verwendet, um Werkzeugausleihen zu schützen. Gleichnamige Werkzeuge behielten getrennte IDs, ungültige Aktionen ließen das Objekt unverändert, und eine gültige Rückgabe ermöglichte die Ausleihe an ein anderes Mitglied. Als Nächstes lernst du, Ergebnisse über mehrere Programmläufe hinweg zu speichern.



