Migration Deep Dive für 13 · Generics öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 13 · 100 % Codeabdeckung

Generics

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

3Legacy-Dateien
8Modern-Dateien
65 → 113Codezeilen
12/12vollständig erfasst

Fachliche Einordnung

Legacy

Raw Type Box

RawBox speichert Object; falsche Casts scheitern erst zur Laufzeit.

Modern

Typisierte Generic Box

TypedBox<T> legt den Typ beim Kompilieren fest.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration113434100%
Box-Beispiel und Test2231271%
Generisches Repository050520%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>13generics-pair</artifactId>
    <packaging>pom</packaging>
    <name>Generics: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 100%

Generics- und Testkonfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>13generics-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>generics-legacy</artifactId>
            <packaging>jar</packaging>
            <name>Generics Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>13generics-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>generics-modern</artifactId>
            <packaging>jar</packaging>
            <name>Generics Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02Box-Beispiel und TestDirektvergleich · Legacy 31 / Modern 27 Zeilen · Ähnlichkeit 1%

Raw Type wird mit typsicherer generischer Klasse verglichen.

Legacy-DateienModern-DateienEinordnung
RawBox.java
RawBoxTest.java
TypedBox.java
TypedBoxTest.java
Direktvergleich
Semantische Ähnlichkeit: 1%

Legacy

package at.aydin.lab.generics.legacy;

// Design Pattern: Generic Container (Legacy) – kapselt Werte, verliert durch Raw Types jedoch Typsicherheit.
@SuppressWarnings({
    "rawtypes", "unchecked"
}) public final class RawBox {
    private Object value;
    public void set(Object value) {
        this.value = value;
    }

    public Object get() {
        return value;
    }
}
package at.aydin.lab.generics.legacy;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

class RawBoxTest {
    @Test
    void requiresRuntimeCast() {
        var b = new RawBox();
        b.set("text");
        assertEquals("text", (String) b.get());
        assertThrows(ClassCastException.class, () -> {
            Integer ignored = (Integer) b.get();
        });
    }
}

Modern

package at.aydin.lab.generics.modern;

// Design Pattern: Generic Container
// Zweck: Der gespeicherte Typ wird zur Compile-Zeit festgelegt; Laufzeit-Casts entfallen.
public final class TypedBox<T> {
    private T value;
    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}
package at.aydin.lab.generics.modern;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class TypedBoxTest {
    @Test
    void preservesTheDeclaredType() {
        TypedBox<String> box = new TypedBox<>();
        box.set("text");
        assertEquals("text", box.get());
    }
}
03Generisches RepositoryNeu in Modern · Legacy 0 / Modern 52 Zeilen · Ähnlichkeit 0%

Die moderne Variante erweitert das Thema um einen vollständigen typsicheren Repository-Anwendungsfall.

Legacy-DateienModern-DateienEinordnung
Identifiable.java
Repository.java
InMemoryRepository.java
Customer.java
InMemoryRepositoryTest.java
Neu in Modern
Semantische Ähnlichkeit: 0%

Legacy

Kein Legacy-Gegenstück. Diese Verantwortung wurde neu eingeführt.

Modern

package at.aydin.lab.generics.modern;

import java.util.*;

// Design Pattern: Generic Repository
// Zweck: Wiederverwendbarer, typsicherer Datenzugriffsvertrag für unterschiedliche Entitäten.
public interface Repository<ID, T extends Identifiable<ID>> {
    T save(T entity);
    Optional<T> findById(ID id);
    List<T> findAll();
}
package at.aydin.lab.generics.modern;

import java.util.*;

public final class InMemoryRepository<ID, T extends Identifiable<ID>> implements Repository<ID, T> {
    private final Map<ID, T> data = new LinkedHashMap<>();
    public T save(T entity) {
        data.put(entity.id(), entity);
        return entity;
    }

    public Optional<T> findById(ID id) {
        return Optional.ofNullable(data.get(id));
    }

    public List<T> findAll() {
        return List.copyOf(data.values());
    }
}
package at.aydin.lab.generics.modern;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

class InMemoryRepositoryTest {
    @Test
    void staysTypeSafe() {
        Repository<Long, Customer> r = new InMemoryRepository<>();
        r.save(new Customer(1L, "Test"));
        assertEquals("Test", r.findById(1L).orElseThrow().name());
    }
}
⌂ Cockpit