API / Impl-Trennung mit Reflection

Beispiel: Calculator API und Impl

public interface Calculator {
    public abstract int add(int a, int b);
    public abstract int sub(int a, int b);
}
public class CalculatorImpl implements Calculator {

    public int add(int a, int b) {
        return a + b;
    }

    public int sub(int a, int b) {
        return a - b;
    }
}

Beispiel: Calculator Factory

public class CalculatorFactory {
    private static final String IMPL_CLASS = "pr2.impl.CalculatorImpl";
    private CalculatorFactory() {}
    public static Calculator createCalculator() {
        Class<?> clazz;
        try {
            clazz = Class.forName(IMPL_CLASS);
            return (Calculator) clazz.newInstance();
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(IMPL_CLASS + " nicht gefunden");
        } catch (InstantiationException e) {
            throw new IllegalStateException(IMPL_CLASS + " hat einen Fehler geworfen: " + e);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException(IMPL_CLASS + " hat keinen public Konstruktor");
        }
    }
}

Beispiel: Calculator Verwender

Calculator calculator = CalculatorFactory.createCalculator();
int ergebnis = calculator.add(1, 5);
System.out.println(ergebnis);

Copyright © 2025 Thomas Smits