Создание функций в Java?

Я пишу демонстрационный код для API, который мы создали, и я продолжаю сталкиваться с той же проблемой, где я повторяю меня, много раз реклама nauseum. Я крайне знаю, что Java, как планируют, добавит закрытия, но у меня нет доступа к ним теперь. Вот то, что повторяется повсеместно, что я хотел бы только к полю в свой собственный небольшой угол:

public BarObj Foo(Double..._input){
    try{
        //things that vary per function
        //but everything else...
    } catch(NullException _null){
        m_Logger.error("Null error exception caught in Blah::Foo");

        return null;
    } catch(Exception ex){
        m_Logger.error( ex.getMessage() );

        return null;
    }
}

О единственном пути я думал, чтобы распространяться вокруг, это путем передачи a Method в функцию, которая несет с ним логику выгоды попытки и оборачивание всего этого в другой функции как так:

public BarObj MyFunc(Double..._input){
    return compose("MyLogic",_input);
}

private BarObj MyLogic(Double..._input) 
    throws Exception{
    //stuff
}

но это выглядит ужасным и несет с ним много шаблона. Существует ли более легкий способ составить функции в Java?

9
задан wheaties 5 February 2010 в 04:36
поделиться

5 ответов

в Java это очень сложно, так как отсутствует первоклассная поддержка функций (в отличие от clojure или scala и, возможно, других).

Однако, вы можете инкапсулировать операцию в объект:

interface Function<R, T> {

     R call(T... input);
}

, затем рефактор Foo как:

static <R, T> R runFunction(Function<R, T> function, T ... input){
    try{
       return function.call(input);
    } catch(NullPointerException _null){
       m_Logger.error("Null error exception caught in Blah::Foo");
       return null;
    } catch(Exception ex){
       m_Logger.error( ex.getMessage() );
       return null;
    }
}

testcase:

class SumDoubles implements Function<Double, Double> {

    @Override
    public Double call(Double... input) {
        Double sum = 0.0;

        for (Double d : input) {
            sum += d;
        }

        return sum;
    }
}

@Test
public void sum() {
    Double sum = runFunction(new SumDoubles(), 1.0, 2.0, 3.0);
    assertThat(sum, is(6.0));
}
8
ответ дан 3 November 2019 в 01:56
поделиться

Если теги JSF не были проанализированы, то это просто означает, что запрос не был передан через HandleServlet . Этот сервлет отвечает за все эти вещи JSF. Необходимо проверить, соответствует ли используемый URL-адрес запроса url-pattern ClausingServlet . Обратите внимание, что он чувствителен к регистру.

Однако это может произойти, если файл был открыт непосредственно в браузере builtin среды IDE. Ты не должен этого делать. Необходимо указать нужный URL в адресной строке браузера builtin или внешнего браузера (например, MSIE/Firefox).

Обновить : еще одна вещь, вы объявили теглиб HTML JSF в атрибуте < html xmlns > ? Это значение было пропущено в фрагменте кода.

Это должно выглядеть как

<html 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html">
-121--2457427-

Очевидно, что это ваш вызов, но для большинства демонстраций API я использовал более длинный формат, который вы имеете наверху. После просмотра кода я обычно копирую и вставляю, чтобы убедиться, что API работает так, как я думаю, что он изменяет его оттуда. Изменение формата, чтобы скрыть некоторые из репетативных частей, определенно то, что вы хотите сделать для разработки OO, но я думаю, что этот своеобразный демо-код является тем, что «чистые боги кода» поймут: -).

-121--3367025-

Нет способа сделать это на java, но попробуйте использовать groovy, если это возможно для вас. Другой вариант, который можно использовать, - это использование аспекта. см. aspectj .

0
ответ дан 3 November 2019 в 01:56
поделиться

Попробуйте lambdaj . Он позволяет добавить немного FP в java довольно легким и читаемым способом. В частности, на этой вики-странице закрытия вы можете найти пример, очень похожий на то, что вы пытаетесь достичь ,

2
ответ дан 3 November 2019 в 01:56
поделиться

Я узнал, что в Java это делается путем создания интерфейса с одним методом. В своем коде вы используете классы, реализующие этот интерфейс.

0
ответ дан 3 November 2019 в 01:56
поделиться

Это, очевидно, ваш призыв, но для большинства демонстраций API, которые я использовал, я предпочитаю более длинный формат, который у вас вверху. После просмотра кода я обычно выполняю копирование и вставку, чтобы убедиться, что API работает так, как я думаю, а затем изменяю его оттуда. Изменение формата, чтобы скрыть некоторые повторяющиеся части, определенно то, что вы хотите сделать для разработки OO, но я думаю, что этот своего рода демонстрационный код - это то, что «боги чистого кода» поймут :-).

0
ответ дан 3 November 2019 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: