IT-Übungen

Gedächtnis & Wissen

HTTP, Java-Schlüsselwörter und -Verhalten, Design Patterns, Testbegriffe, Git.

Lesestand

  1. HTTP 201 ★☆☆ HTTP

    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.

  2. HTTP 410 ★★☆ HTTP

    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.

  3. HTTP 502 ★★☆ HTTP · Infrastruktur

    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.

  4. HTTP 429 ★☆☆ HTTP · Lasttests

    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.

  5. Idempotenz ★★★ HTTP · REST

    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.

  6. transient ★★☆ Java · Schlüsselwörter
    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.

  7. volatile ★★★ Java · Nebenläufigkeit
    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.

  8. final bei Klassen ★☆☆ Java · Schlüsselwörter
    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.

  9. Standardwerte ★☆☆ Java · Datentypen
    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.

  10. null als Schlüssel ★★☆ Java · Collections

    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.

  11. Checked Exceptions ★★☆ Java · Exceptions

    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.

  12. Pattern erkennen I ★☆☆ Design Patterns
    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.

  13. Pattern erkennen II ★☆☆ Design Patterns
    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“).

  14. Pattern erkennen III ★★☆ Design Patterns
    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.

  15. Pattern erkennen IV ★★☆ Design Patterns
    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.

  16. Pattern erkennen V ★★★ Design Patterns
    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.

  17. Testpyramide ★☆☆ Teststrategie

    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.

  18. Mock und Stub ★★☆ Test Doubles

    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.

  19. JUnit 5 ★☆☆ JUnit

    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.

  20. git stash ★★☆ Git

    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.