Como tenho uma base de código antiga que preciso refatorar usando o Java 8, tenho uma interface que informa se meu site atual suporta a plataforma.
public interface PlatformSupportHandler {
public abstract boolean isPaltformSupported(String platform);
}
e eu tenho várias classes implementando-o e cada classe suporta uma plataforma diferente.
Algumas das classes de implementação são:
@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);
}
}
Outra implementação:
@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);
}
}
Em tempo de execução no meu filtro, recebo o bean necessário que desejo:
platformSupportHandler = (PlatformSupportHandler) ApplicationContextUtil
.getBean(subProductType + Constants.PLATFORM_SUPPORT_HANDLER_APPEND);
e ligue isPlatformSupported
para saber se meu site atual é compatível com a plataforma a seguir ou não.
Eu sou novo no Java 8, então existe alguma maneira de refatorar esse código sem criar várias classes? Como a interface contém apenas um método, posso de alguma forma usar o lambda para refatorá-lo?
Respostas:
Se você deseja manter o design atual, pode fazer algo assim:
Este método tem a vantagem de não criar classe por tipo (desconto, bsafe, etc), portanto, isso responde à pergunta.
Indo um passo adiante, o que acontece se não houver um tipo solicitado, atualmente ele falhará porque o bean não existe no contexto do aplicativo - não é uma abordagem realmente boa.
Assim, você pode criar um mapa do tipo para o conjunto de plataformas suportadas, manter o mapa na configuração ou algo e deixar a primavera fazer sua mágica. Você vai acabar com algo assim:
Agora, se você seguir essa abordagem, a adição de novos tipos suportados ficará sem código, você só adiciona uma configuração, de longe o melhor método que posso oferecer.
Porém, ambos os métodos não possuem os recursos do java 8;)
fonte
Você pode usar o seguinte em sua classe de configuração, onde você pode criar beans:
Além disso, quando você deseja usar o bean, é novamente muito fácil:
fonte
Como foi escrito na resposta de Mark Bramnik, você pode mover isso para a configuração.
Suponha que seria no yaml dessa maneira:
Então você pode criar uma classe de configuração para ler isto:
Você pode criar um manipulador com o código de verificação. Ou coloque-o no seu filtro como abaixo:
fonte