比如说,你有一堆函数需要检查登录验证。首先,它看起来像:
public Response createThing(){
if(!validLogin(httpRequest, uriInfo)){
return Response.status(Response.Status.FORBIDDEN);
}
//Do the function
}
第一个代码块存在于每个服务调用的顶部,但我不知道如何将它包装到另一个函数中,因为它包含一个return语句。我想要类似于以下内容:
public Response createThing(){
validateLogin(httpRequest, uriInfo);
//Do the function
}
或
public Response createThing(){
//Implied check somehow?
//Do the function
}
我确定那里有一些人们使用的模式或约定。感谢。
答案 0 :(得分:2)
从 Java 8 开始,功能被视为一等公民。这允许您以前所未有的方式重用代码。您可以创建包含固定部分和变量部分的模板方法,如下所示:
public <T,U,R extends Response> R doSomething(final BiFunction<T,U,R> funct,T input1,U input2){
if(validLogin(input1, input2)) {//fixed part
return funct.apply(input1,input2);//variable part
}
}
答案 1 :(得分:0)
您可以使用 AOP ,面向方面编程。
使用AspectJ或Spring,您可以定义“建议”,该建议在代码中的配置点之前,之后或周围应用。
例如:
@Before("createThing(httpRequest, uriInfo)")
public void validate(HttpRequest request, UriInfo uriInfo) {
if(!valid(request,uriInfo)) {
throw new InvalidCreateThingException();
}
}
这是非常强大和灵活的,特别是如果你使用@Around
建议,这个建议稍微复杂一些,但意味着你既可以挂钩到方法的输入,又可以影响它的输出。您可以使用通配符配置AOP建议,以便将其应用于任何匹配的对象/方法。
使用AOP实现了很多Spring的“魔力”。 Spring和AspectJ都提供了很好的文档。
答案 2 :(得分:-2)
public Response validateLogin(){
if(!validLogin(httpRequest, uriInfo)){
return Response.status(Response.Status.FORBIDDEN);
}
return Responce.status(Response.Status.OK)
}
public Response createThing(){
if(!validateLogin().equals(Response.status(Response.Status.OK)){
return Response.status(Response.Status.FORBIDDEN);
}
//Do the function
}