Gedächtnis & Wissen
HTTP, Java-Schlüsselwörter und -Verhalten, Design Patterns, Testbegriffe, Git.
- HTTP 201 ★☆☆ HTTP ✓ gelöst
Ein REST-Aufruf POST /kunden antwortet mit Status 201.
Was bedeutet 201?
Lösung anzeigen
Richtig: Created – eine neue Ressource wurde angelegt
201 Created ist die korrekte Antwort auf ein erfolgreiches Anlegen, meist mit einem Location-Header auf die neue Ressource. 200 OK, 202 Accepted und 204 No Content sind die Nachbarn. Für Tests: Ein POST, der 200 statt 201 liefert, ist oft ein Hinweis auf eine unsaubere API.
- HTTP 410 ★★☆ HTTP ✓ gelöst
Ein Server antwortet auf eine alte Produktseite mit Status 410.
Was bedeutet 410 im Unterschied zu 404?
Lösung anzeigen
Richtig: Gone – die Ressource gab es, sie wurde dauerhaft entfernt
404 sagt nur „nicht gefunden“, ohne Aussage, ob es die Seite je gab. 410 Gone sagt ausdrücklich: gab es, kommt nicht wieder. Suchmaschinen entfernen solche Seiten schneller. Für einen Umzug wäre 301 richtig.
- HTTP 502 ★★☆ HTTP · Infrastruktur ✓ gelöst
Nutzer erhalten Status 502. Die Anwendung läuft hinter einem Reverse Proxy (z. B. nginx).
Worauf deutet 502 hin?
Lösung anzeigen
Richtig: Bad Gateway – der Proxy hat vom dahinterliegenden Server keine gültige Antwort bekommen
500 kommt von der Anwendung selbst. 502 kommt vom Vermittler davor: Der Anwendungsserver ist abgestürzt, nicht gestartet oder liefert Unsinn. 504 wäre ein Timeout dabei. Der Statuscode sagt also schon, auf welchem Server man suchen muss.
- HTTP 429 ★☆☆ HTTP · Lasttests ✓ gelöst
Bei einem Lasttest liefert die API nach einigen Sekunden nur noch Status 429.
Was bedeutet 429?
Lösung anzeigen
Richtig: Too Many Requests – ein Limit für Anfragen pro Zeitraum wurde überschritten
429 ist die Antwort einer Ratenbegrenzung (Rate Limiting). Oft gibt der Header Retry-After an, wann es wieder geht. Bei Lasttests muss man klären, ob man das Limit testen will oder ob es für den Test ausgenommen werden soll.
- Idempotenz ★★★ HTTP · REST ✓ gelöst
Eine Anfrage wird wegen eines Netzwerkfehlers automatisch zweimal gesendet.
Bei welcher HTTP-Methode ist das am ehesten ein Problem, weil sie nicht idempotent ist?
Lösung anzeigen
Richtig: POST
Idempotent heißt: Zweimal ausgeführt hat dieselbe Wirkung wie einmal. GET liest nur, PUT setzt einen festen Zustand, DELETE löscht (beim zweiten Mal ist es schon weg). POST legt typischerweise etwas an, also zwei Bestellungen statt einer. Gute APIs lösen das mit einem Idempotenz-Schlüssel.
- transient ★★☆ Java · Schlüsselwörter ✓ gelöst
class Benutzer implements Serializable { String name; transient String passwort; }Was bewirkt transient?
Lösung anzeigen
Richtig: Das Feld wird beim Serialisieren nicht mitgespeichert
Transiente Felder überspringt die Java-Serialisierung, nach dem Einlesen sind sie null (bzw. 0/false). Gedacht für Passwörter, Caches oder Werte, die sich neu berechnen lassen. „Nicht änderbar“ wäre final, „für Threads sichtbar“ wäre volatile.
- volatile ★★★ Java · Nebenläufigkeit ✓ gelöst
private volatile int zaehler; public void erhoehe() { zaehler++; }Ist erhoehe() damit sicher, wenn mehrere Threads gleichzeitig zählen?
Lösung anzeigen
Richtig: Nein, volatile sorgt nur für Sichtbarkeit, zaehler++ bleibt nicht atomar
zaehler++ sind drei Schritte: lesen, erhöhen, schreiben. Zwei Threads können denselben alten Wert lesen, dann geht eine Erhöhung verloren. volatile garantiert nur, dass jeder Thread den aktuellsten Wert sieht. Richtig: AtomicInteger.incrementAndGet() oder synchronized.
- final bei Klassen ★☆☆ Java · Schlüsselwörter ✓ gelöst
public final class Geldbetrag { … }Was bedeutet final an dieser Stelle?
Lösung anzeigen
Richtig: Von der Klasse kann keine Unterklasse gebildet werden
final an einer Klasse verhindert Vererbung (wie bei String). Unveränderlich wird die Klasse erst, wenn auch alle Felder final sind und keine Methoden den Zustand ändern. Nur einmal instanziierbar wäre ein Singleton.
- Standardwerte ★☆☆ Java · Datentypen ✓ gelöst
class Werte { static int zahl; static boolean flag; static String text; static double d; }Welche Werte haben die Felder, wenn sie nie zugewiesen wurden?
Lösung anzeigen
Richtig: 0 false null 0.0
Felder bekommen Standardwerte: Zahlen 0 bzw. 0.0, boolean false, Objekte (auch String) null. Lokale Variablen in Methoden dagegen haben keinen Standardwert, dort meldet der Compiler einen Fehler beim Lesen.
- null als Schlüssel ★★☆ Java · Collections ✓ gelöst
Es soll map.put(null, 1) ausgeführt werden.
Welche Map erlaubt null als Schlüssel?
Lösung anzeigen
Richtig: HashMap
HashMap legt einen null-Schlüssel in einen eigenen Bucket. TreeMap muss Schlüssel vergleichen, ConcurrentHashMap und Hashtable lehnen null grundsätzlich ab, alle drei werfen eine NullPointerException. Wichtig beim Austausch von Implementierungen: Code, der mit HashMap lief, kann nach dem Wechsel scheitern.
- Checked Exceptions ★★☆ Java · Exceptions ✓ gelöst
Vier Exceptions stehen zur Auswahl.
Welche ist eine checked Exception, die man fangen oder mit throws deklarieren muss?
Lösung anzeigen
Richtig: IOException
Checked sind alle Exceptions, die nicht von RuntimeException (oder Error) erben. IOException gehört dazu, weil Ein- und Ausgabefehler auch bei korrektem Code auftreten können. Die anderen drei sind RuntimeExceptions und meist Programmierfehler.
- Pattern erkennen I ★☆☆ Design Patterns ✓ gelöst
public class Konfiguration { private static final Konfiguration INSTANZ = new Konfiguration(); private Konfiguration() { } public static Konfiguration getInstance() { return INSTANZ; } }Welches Entwurfsmuster ist das?
Lösung anzeigen
Richtig: Singleton
Privater Konstruktor plus statische Methode, die immer dieselbe Instanz liefert: ein Singleton. Für Tests oft lästig, weil sich der Zustand nicht pro Test zurücksetzen lässt. Heute nutzt man dafür eher Dependency Injection.
- Pattern erkennen II ★☆☆ Design Patterns ✓ gelöst
Bestellung b = Bestellung.neu() .kunde("Sven") .artikel("Buch", 2) .expressVersand() .erstellen();Welches Entwurfsmuster ist das?
Lösung anzeigen
Richtig: Builder
Ein Objekt wird schrittweise mit verketteten Methoden zusammengesetzt und am Ende mit erstellen() (oft build()) fertiggestellt. Praktisch bei vielen optionalen Werten, in Tests ideal für lesbare Testdaten („Test Data Builder“).
- Pattern erkennen III ★★☆ Design Patterns ✓ gelöst
button.addListener(e -> speichern()); button.addListener(e -> protokollieren()); // im Button: for (Listener l : listeners) { l.geklickt(event); }Welches Entwurfsmuster ist das?
Lösung anzeigen
Richtig: Observer
Mehrere Interessenten melden sich an und werden bei einem Ereignis benachrichtigt, ohne dass der Button sie kennen muss. Typischer Testfehler: Listener werden nie abgemeldet, was Speicherlecks verursacht.
- Pattern erkennen IV ★★☆ Design Patterns ✓ gelöst
interface Versandkosten { BigDecimal berechne(Bestellung b); } class StandardVersand implements Versandkosten { … } class ExpressVersand implements Versandkosten { … } kasse.setVersandkosten(new ExpressVersand());Welches Entwurfsmuster ist das?
Lösung anzeigen
Richtig: Strategy
Austauschbare Rechenwege hinter einer gemeinsamen Schnittstelle, die zur Laufzeit gesetzt werden. Für Tests ein Glücksfall: Jede Strategie lässt sich einzeln prüfen, und in der Kasse kann man eine feste Test-Strategie einsetzen. Auch ein Comparator ist eine Strategie.
- Pattern erkennen V ★★★ Design Patterns ✓ gelöst
Reader r = new BufferedReader( new InputStreamReader( new FileInputStream("daten.txt"), StandardCharsets.UTF_8));Welches Entwurfsmuster nutzt die Java-IO-Bibliothek hier?
Lösung anzeigen
Richtig: Decorator
Jede Schicht umhüllt die nächste und ergänzt eine Fähigkeit: Pufferung, Zeichenumwandlung. Alle haben eine passende Schnittstelle, deshalb lassen sie sich beliebig stapeln. Ein Proxy steuert dagegen den Zugriff, statt Fähigkeiten hinzuzufügen.
- Testpyramide ★☆☆ Teststrategie ✓ gelöst
Die Testpyramide beschreibt die empfohlene Verteilung von Tests.
Welche Tests sollten die breite Basis bilden, also am zahlreichsten sein?
Lösung anzeigen
Richtig: Unit-Tests
Unit-Tests sind schnell, stabil und zeigen genau, wo ein Fehler liegt. Nach oben werden Tests langsamer, teurer und anfälliger, deshalb weniger. Das Gegenteil, viele UI-Tests und wenige Unit-Tests, nennt man „Eistüte“, ein bekanntes Anti-Muster.
- Mock und Stub ★★☆ Test Doubles ✓ gelöst
In einem Test wird der E-Mail-Dienst ersetzt. Am Ende prüft der Test, dass sende() genau einmal mit der richtigen Adresse aufgerufen wurde.
Wie nennt man ein solches Testobjekt?
Lösung anzeigen
Richtig: Mock – es prüft, ob und wie es aufgerufen wurde
Ein Stub liefert feste Antworten, der Test prüft danach das Ergebnis. Ein Mock wird selbst geprüft: welche Methode, wie oft, mit welchen Werten. Ein Fake funktioniert wirklich, nur einfacher (z. B. eine Datenbank im Speicher). Ein Dummy füllt nur eine Parameterlücke.
- JUnit 5 ★☆☆ JUnit ✓ gelöst
Vor jedem einzelnen Test soll ein frisches Testobjekt angelegt werden.
Welche Annotation verwendet man in JUnit 5?
Lösung anzeigen
Richtig: @BeforeEach
@BeforeEach läuft vor jedem Test, @BeforeAll einmal vor allen (und muss statisch sein). @Before ist der Name aus JUnit 4, @Setup gibt es nicht. Eine typische Falle beim Umstieg von JUnit 4.
- git stash ★★☆ Git ✓ gelöst
Mitten in einer Änderung muss schnell ein dringender Fehler auf einem anderen Branch behoben werden. Die halbfertige Arbeit soll nicht committet werden.
Was macht git stash?
Lösung anzeigen
Richtig: Es legt die ungesicherten Änderungen beiseite und stellt einen sauberen Arbeitsstand her
git stash speichert die Änderungen lokal zwischen. Danach Branch wechseln, Fehler beheben, zurückwechseln und mit git stash pop weitermachen. Endgültig löschen würde git checkout -- . bzw. git restore, zurücksetzen git reset --hard.