Ich habe eine alte Codebasis, die ich mit Java 8 umgestalten muss, daher habe ich eine Schnittstelle, die angibt, ob meine aktuelle Site die Plattform unterstützt.
public interface PlatformSupportHandler {
public abstract boolean isPaltformSupported(String platform);
}
und ich habe mehrere Klassen, die es implementieren, und jede Klasse unterstützt eine andere Plattform.
Einige der implementierenden Klassen sind:
@Component("bsafePlatformSupportHandler")
public class BsafePlatoformSupportHandler implements PlatformSupportHandler {
String[] supportedPlatform = {"iPad", "Android", "iPhone"};
Set<String> supportedPlatformSet = new HashSet<>(Arrays.asList(supportedPlatform));
@Override
public boolean isPaltformSupported(String platform) {
return supportedPlatformSet.contains(platform);
}
}
Eine weitere Implementierung:
@Component("discountPlatformSupportHandler")
public class DiscountPlatoformSupportHandler implements PlatformSupportHandler{
String[] supportedPlatform = {"Android", "iPhone"};
Set<String> supportedPlatformSet = new HashSet<>(Arrays.asList(supportedPlatform));
@Override
public boolean isPaltformSupported(String platform) {
return supportedPlatformSet.contains(platform);
}
}
Zur Laufzeit in meinem Filter erhalte ich die gewünschte Bean, die ich möchte:
platformSupportHandler = (PlatformSupportHandler) ApplicationContextUtil
.getBean(subProductType + Constants.PLATFORM_SUPPORT_HANDLER_APPEND);
und rufen Sie isPlatformSupported
an, um zu erfahren, ob meine aktuelle Site die folgende Plattform unterstützt oder nicht.
Ich bin neu in Java 8, gibt es also eine Möglichkeit, diesen Code umzugestalten, ohne mehrere Klassen zu erstellen? Kann ich Lambda verwenden, um es umzugestalten, da die Schnittstelle nur eine Methode enthält?
Antworten:
Wenn Sie sich an das aktuelle Design halten möchten, können Sie Folgendes tun:
Diese Methode hat den Vorteil, dass keine Klasse pro Typ erstellt wird (Rabatt, Sicherheit usw.), sodass die Frage beantwortet wird.
Wenn Sie noch einen Schritt weiter gehen, was passiert, wenn kein Typ angefordert wurde, schlägt dies derzeit fehl, da die Bean im Anwendungskontext nicht vorhanden ist - kein wirklich guter Ansatz.
Sie können also eine Karte des Typs für die unterstützten Plattformen erstellen, die Karte in der Konfiguration beibehalten oder etwas, das der Frühling seine Magie entfalten lässt. Sie werden am Ende so etwas haben:
Wenn Sie nun diesem Ansatz folgen und neue unterstützte Typen hinzufügen, wird das Codieren überhaupt nicht mehr möglich. Sie fügen nur eine Konfiguration hinzu. Dies ist bei weitem die beste Methode, die ich anbieten kann.
Bei beiden Methoden fehlen jedoch die Java 8-Funktionen;)
quelle
In Ihrer Konfigurationsklasse können Sie Folgendes verwenden, um Beans zu erstellen:
Auch wenn Sie die Bohne verwenden möchten, ist es wieder sehr einfach:
quelle
Wie in Mark Bramniks Antwort geschrieben, können Sie dies in die Konfiguration verschieben.
Angenommen, es wäre auf diese Weise in Yaml:
Dann können Sie eine Konfigurationsklasse erstellen, um Folgendes zu lesen:
Sie können dann einen Handler mit Prüfcode erstellen. Oder legen Sie es wie folgt in Ihren Filter:
quelle