Java 8 Supplier Beispiel

Seit Java 8 enthält die Java API das Interface Supplier. Doch für was wird dieses Interface verwendet? Supplier bedeutet übersetzt etwa "Anbieter", "Lieferant" oder auch "Versorger". Oft wird Supplier auch mit dem eher bekannten Begriff Producer gleichgesetzt.

Inhaltsverzeichnis

Das Interface Supplier

Das Interface Supplier enthält genau eine Methode, nämlich T get(), die einfach ein Objekt vom generischen Typ T zurückgibt:

package java.util.function;

@FunctionalInterface
public interface Supplier<T> {
    T get();
}

Beispiel

Supplier machen immer dann Sinn, wenn es der Methode, die den Supplier schlussendlich aufruft egal ist, wie die Daten erzeugt werden oder es unterschiedliche Quellen für ein Objekt gibt. Als Beispiel hier dient eine Factory, die einen User erzeugt:

public class UserFactory {

    private Supplier<String> passwordSupplier;

    public UserFactory(Supplier<String> supplier){
        this.passwordSupplier = supplier;
    }

    public User createUser(String username){
        User user = new User();
        user.setUsername(username);
        user.setPassword(passwordSupplier.get());
        return user;
    }
}

Die UserFactory nimmt im Konstruktor einen Supplier, der das Passwort zur Verfügung stellt. Wie man mit Java ein Passwort generieren kann erläutert dieser Artikel.

Je nachdem welche Art von User erstellt wird, benötigt dieser vielleicht ein unterschiedliches Passwort. Ein Standarduser benötigt ein alphanumerisches Passwort, ein Karten-User einen numerischen Pin. Für beide Typen lassen sich nun Supplier erstellen:

Standard-Passwort Supplier

Der PasswordSupplier generiert ein alphanumerisches Passwort:

public class PasswordSupplier implements Supplier {

    private static String ALLOWED_CHARS = "0123456789abcdefghijklmnopqrstuvwABCDEFGHIJKLMNOP";
    private final int length;

    public PasswordSupplier(int length){
        this.length = length;
    }

    @Override
    public Object get() {
        SecureRandom random = new SecureRandom();
        StringBuffer pass = new StringBuffer();
        for (int i = 0; i < length; i++) {
            pass.append(ALLOWED_CHARS.charAt(random.nextInt(ALLOWED_CHARS.length())));
        }
        return pass.toString();
    }
}

Pincode Supplier

Der PinSupplier generiert ein numerisches Passwort:

public class PinSupplier implements Supplier {

    private final int length;

    public PinSupplier(int length){
        this.length = length;
    }

    @Override
    public Object get() {
        SecureRandom random = new SecureRandom();
        StringBuffer pass = new StringBuffer();
        for (int i = 0; i < length; i++) {
            pass.append(random.nextInt(10));
        }
        return pass.toString();
    }
}

Verwendung des Suppliers

Nun können wir für jede Art von User eine eigene Factory erstellen und User erstellen. Der Web-User benötigt ein Passwort aus Buchstaben und Zahlen, der Karten-User benötigt einen 4-stelligen Pincode.

UserFactory webUserFactory = new UserFactory(new PasswordSupplier(8));
UserFactory cardUseractory = new UserFactory(new PinSupplier(4));

System.out.println(webUserFactory.createUser("user1"));
// Ausgabe: [username:user1 , password:FlBCqfI0]

System.out.println(cardUseractory.createUser("user2"));
// Ausgabe: [username:user2 , password:8936]

Der Vorteil eines Suppliers ist, dass das Passwort von der Factory selbst erstellt werden kann und nicht jedes Mal an die Methode createUser() übergeben werden muss. Weiters kann eine Facory Objekte für mehrere Anwendungsfälle erzeugen. Ein klassischer Fall von DRY (don't repeat yourself).


Ähnliche Artikel