Warum Code Review nicht über Kritik, sondern über Qualität geht
\nStellen Sie sich vor: Sie öffnen einen Pull-Request eines Kollegen. Da sind 500 Zeilen Code, es riecht nach Copy-Paste, und an einer Stelle hat jemand vergessen, eine Ressource zu schließen. Ihre Aufgabe ist es, nicht nur Bugs zu finden, sondern den Code besser zu machen. Code Review auf Java ist keine Polizeiaufsicht, sondern gemeinsame Kreativarbeit. Ein guter Reviewer rettet das Team vor technischen Schulden, ein schlechter demotiviert oder übersieht Sicherheitslücken.
\nIn diesem Artikel erkläre ich, was man im Code Review auf Java prüfen sollte, um keine Zeit mit Kleinigkeiten zu verschwenden, aber nichts Kritisches zu übersehen. Sie erhalten eine fertige Checkliste und Beispiele aus der Praxis.
\n\nArchitektur und Design: An die Wurzel gehen
\nBevor Sie in die Details eintauchen, bewerten Sie das Gesamtbild. Schlechte Architektur lässt sich nicht durch Formatierung heilen.
\nVerstoß gegen SOLID
\nPrüfen Sie, ob sich die Klasse nicht in ein „göttliches Objekt" verwandelt hat. Beispiel für einen Verstoß gegen Single Responsibility:
\npublic class OrderService {\n public void createOrder(Order order) {\n // Validierung\n // Rabattberechnung\n // E-Mail-Versand\n // Logging\n // Speichern in der DB\n }\n}\n\nHier gibt es fünf Gründe für eine Änderung. Richtig wäre, das Logging und den Versand in separate Dienste auszulagern.
\nÜbermäßige Komplexität
\nManchmal löst Code eine einfache Aufgabe auf komplizierte Weise. Fragen Sie sich: „Geht es einfacher?" Wenn ja, schreiben Sie es ins Review. Denken Sie an das KISS-Prinzip.
\n\nSicherheit: Lücken, die man nicht übersehen darf
\nJava Code Review muss die Sicherheitsprüfung einschließen. Auch wenn das Projekt intern ist.
\nSQL-Injection
\nZeichenkettenverkettung ist böse:
\n// SCHLECHT\nString query = "SELECT * FROM users WHERE name = '" + userName + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);\n\nRichtig ist die Verwendung von PreparedStatement:
// GUT\nString query = "SELECT * FROM users WHERE name = ?";\nPreparedStatement pstmt = connection.prepareStatement(query);\npstmt.setString(1, userName);\nResultSet rs = pstmt.executeQuery();\n\nPreisgabe sensibler Daten
\nPrüfen Sie, ob Passwörter, Token oder Kreditkartennummern geloggt werden. Verwenden Sie @ToString.Exclude in Lombok oder explizites Ignorieren.
Unsicherer Objektvergleich
\n// SCHLECHT (Referenzvergleich)\nif (password == storedPassword) { ... }\n// GUT\nif (password.equals(storedPassword)) { ... }\n\n\nLeistung: Engpässe
\nOptimieren Sie nicht vorzeitig, aber übersehen Sie auch keine offensichtlichen Bremsen.
\nÜberflüssige Operationen in Schleifen
\n// SCHLECHT: length() wird jedes Mal aufgerufen\nfor (int i = 0; i < list.size(); i++) { ... }\n// GUT\nint size = list.size();\nfor (int i = 0; i < size; i++) { ... }\n\nVerwendung von Streams für einfache Aufgaben
\nManchmal ist eine normale Schleife lesbarer und schneller:
\n// Überflüssig\nlist.stream().filter(x -> x > 5).collect(Collectors.toList());\n// Einfach\nList<Integer> result = new ArrayList<>();\nfor (int x : list) {\n if (x > 5) result.add(x);\n}\n\nSpeicherleck
\nPrüfen Sie, ob vergessen wurde, InputStream, Connection oder Session zu schließen. Verwenden Sie try-with-resources:
try (Connection conn = getConnection();\n PreparedStatement stmt = conn.prepareStatement(sql)) {\n // Arbeit\n} catch (SQLException e) {\n log.error("DB-Fehler", e);\n}\n\n\nLesbarkeit und Stil: Code wie ein Buch
\nCode Review Checkliste beinhaltet unbedingt die Lesbarkeit. Code wird einmal geschrieben, aber Dutzende Male gelesen.
\nMagische Zahlen und Zeichenketten
\n// SCHLECHT\nif (status == 3) { ... }\n// GUT\nprivate static final int STATUS_COMPLETED = 3;\nif (status == STATUS_COMPLETED) { ... }\n\n