如何在另一个函数中包装函数的验证?

时间:2017-02-21 13:38:15

标签: java function validation design-patterns return

比如说,你有一堆函数需要检查登录验证。首先,它看起来像:

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
}

我确定那里有一些人们使用的模式或约定。感谢。

3 个答案:

答案 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
}