Tengo una base de código antigua que necesito refactorizar con Java 8, por lo que tengo una interfaz que indica si mi sitio actual es compatible con la plataforma.
public interface PlatformSupportHandler {
public abstract boolean isPaltformSupported(String platform);
}
y tengo varias clases que lo implementan y cada clase admite una plataforma diferente.
Algunas de las clases de implementación son:
@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);
}
}
Otra implementación:
@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);
}
}
En tiempo de ejecución en mi filtro, obtengo el bean requerido que quiero:
platformSupportHandler = (PlatformSupportHandler) ApplicationContextUtil
.getBean(subProductType + Constants.PLATFORM_SUPPORT_HANDLER_APPEND);
y llame isPlatformSupported
para saber si mi sitio actual es compatible con la siguiente plataforma o no.
Soy nuevo en Java 8, ¿hay alguna forma de refactorizar este código sin crear varias clases? Como la interfaz solo contiene un método, ¿puedo usar lambda de alguna manera para refactorizarlo?
Respuestas:
Si desea apegarse al diseño actual, podría hacer algo como esto:
Este método tiene la ventaja de no crear clases por tipo (descuento, bsafe, etc.), por lo que esto responde la pregunta.
Yendo un paso más allá, qué sucede si no se solicitó ningún tipo, actualmente fallará porque el bean no existe en el contexto de la aplicación, no es un enfoque realmente bueno.
Por lo tanto, podría crear un mapa de tipo para el conjunto de plataformas compatibles, mantener el mapa en la configuración o algo y dejar que el resorte haga su magia. Terminarás con algo como esto:
Ahora, si sigue este enfoque, agregar nuevos tipos admitidos se vuelve sin código, solo agrega una configuración, con mucho, es el mejor método que puedo ofrecer.
Sin embargo, ambos métodos carecen de las características de Java 8;)
fuente
Puede usar lo siguiente en su clase de configuración donde puede crear beans:
Además, cuando quieras usar el bean, nuevamente es muy fácil:
fuente
Como estaba escrito en la respuesta de Mark Bramnik, puede mover esto a la configuración.
Supongamos que estaría en yaml de esa manera:
Entonces puedes crear una clase de configuración para leer esto:
Puede crear un controlador con código de verificación. O colóquelo en su filtro como a continuación:
fuente