2017-02-21 104 views
2

Скажите, например, у вас есть куча функций, которые все должны проверить для проверки входа. Начнем с того, что выглядит примерно так:Как вы завершаете проверку функции в рамках другой функции?

public Response createThing(){ 
    if(!validLogin(httpRequest, uriInfo)){ 
     return Response.status(Response.Status.FORBIDDEN); 
    } 

    //Do the function 
} 

То есть первый блок кода в верхней части каждого вызова службы, но я не знаю, как обернуть его в другую функцию, поскольку она содержит оператор возврата. Я хотел бы что-то похожее на следующее:

public Response createThing(){ 
    validateLogin(httpRequest, uriInfo); 

    //Do the function 
} 

или

public Response createThing(){ 
    //Implied check somehow? 

    //Do the function 
} 

я уверен, что есть какая-то модель или конвенции, что там люди используют. Благодарю.

+0

Является ли это JavaEE? Для этого вы бы использовали фильтр. Я считаю, что общий шаблон называется «Перехват фильтра» – puhlen

+0

, было бы нормально обрабатывать его как исключение, которое вызывается методом проверки и обрабатывается в вашем методе обертки? Например, с пользовательским исключением? – Rhayene

+0

Для этого конкретного случая да, это JavaEE, но у меня есть тот же вопрос и для аналогичных базовых вызовов (например, для проверки ввода не должно быть null.). Я посмотрю на «Перехват фильтра», спасибо. – GuitarStrum

ответ

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 
    } 
} 
+0

Это кажется многообещающим; Спасибо, спасибо. – GuitarStrum

-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 
} 
+0

Это все еще возвращает меня к той же проблеме структурно, среди прочего. Первые три строки createThing() будут дублироваться. – GuitarStrum

0

Вы можете использовать АОП, Аспект-ориентированное программирование.

Используя AspectJ или Spring, вы можете определить «Совет», который применяется до, после или вокруг настроенных точек вашего кода.

Например:

@Before("createThing(httpRequest, uriInfo)") 
public void validate(HttpRequest request, UriInfo uriInfo) { 
    if(!valid(request,uriInfo)) { 
      throw new InvalidCreateThingException(); 
    } 
} 

Это очень мощный и гибкий, особенно если вы используете @Around совет, который является несколько более сложным, чтобы указать, но означает, что вы можете как крючок на входы метода и влияют на его результаты. Вы можете настроить советы АОП с помощью подстановочных знаков, поэтому он применяется к любому совпадающему объекту/методу.

Много волшебства «Весны» достигается с помощью АОП. И Spring, и AspectJ обеспечивают хорошую документацию.

 Смежные вопросы

  • Нет связанных вопросов^_^