Part 4

Fortgeschrittene Programmierkonzepte

Dieser Abschnitt ist für Studierende gedacht, die bereits ein solides Verständnis der objektorientierten Programmierung (OOP) haben und sich tiefer in fortgeschrittene Konzepte vertiefen möchten. Die folgenden Themen erweitern die Grundlagen, die im vorangegangenen Material behandelt wurden.

1. Entwurfsmuster (Design Patterns)

Entwurfsmuster sind wiederverwendbare Lösungen für häufig auftretende Probleme in der Softwareentwicklung. Hier sind einige der bekanntesten Entwurfsmuster:

1.1 Singleton Pattern

Das Singleton-Muster stellt sicher, dass eine Klasse nur eine Instanz hat und bietet einen globalen Zugriffspunkt auf diese Instanz.

Beispiel:

public class Singleton {
    private static Singleton instance;
    
    private Singleton() { }
    
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

1.2 Factory Pattern

Das Factory-Muster bietet eine Schnittstelle zur Erstellung von Objekten, ohne dass die exakte Klasse des zu erstellenden Objekts bekannt sein muss.

Beispiel:

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    public void draw() {
        System.out.println("Drawing a Circle");
    }
}

public class Square implements Shape {
    public void draw() {
        System.out.println("Drawing a Square");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        }
        return null;
    }
}

2. Solid Principles

Die SOLID-Prinzipien sind Richtlinien für gutes Softwaredesign und helfen dabei, Code verständlicher, flexibler und wartbarer zu machen.

2.1 Single Responsibility Principle (SRP)

Eine Klasse sollte nur eine einzige Verantwortlichkeit haben, d.h., sie sollte nur einen Grund zur Änderung haben.

2.2 Open/Closed Principle (OCP)

Software-Entitäten (Klassen, Module, Funktionen, etc.) sollten offen für Erweiterung, aber geschlossen für Veränderungen sein.

3. Rekursion

Rekursion ist eine Methode, bei der eine Funktion sich selbst aufruft, um ein Problem zu lösen. Rekursion wird häufig zur Lösung von Problemen verwendet, die auf kleinere Teilprobleme reduziert werden können.

Beispiel:

public int factorial(int n) {
    if (n <= 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

4. Generische Programmierung

Generics ermöglichen es Ihnen, Klassen, Schnittstellen und Methoden zu definieren, die Parameter vom Typ akzeptieren. Dies macht Ihren Code flexibler und wiederverwendbarer.

Beispiel:

public class Box<T> {
    private T t;

    public void set(T t) {
        this.t = t;
    }

    public T get() {
        return t;
    }
}

5. Lambda-Ausdrücke und Streams

Java 8 führte Lambda-Ausdrücke und Streams ein, die das Schreiben von kompaktem und ausdrucksstarkem Code ermöglichen.

5.1 Lambda-Ausdrücke

Lambda-Ausdrücke sind eine kürzere Form, um anonyme Klassen mit einer Methode zu schreiben.

Beispiel:

List<String> names = Arrays.asList("Anna", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));

5.2 Streams

Streams ermöglichen es, große Datenmengen in einer funktionalen Art und Weise zu verarbeiten.

Beispiel:

List<String> names = Arrays.asList("Anna", "Bob", "Charlie");
names.stream()
     .filter(name -> name.startsWith("A"))
     .forEach(System.out::println);

Fazit

Diese fortgeschrittenen Konzepte bieten Ihnen Werkzeuge und Techniken, um robustere und flexiblere Software zu entwickeln. Es ist wichtig, diese Konzepte zu verstehen und zu üben, um ein besserer Programmierer zu werden.

Sie haben das Ende dieses Abschnitts erreicht!