Я пишу демонстрационный код для 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?
в 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));
}
Если теги 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 .
Попробуйте lambdaj . Он позволяет добавить немного FP в java довольно легким и читаемым способом. В частности, на этой вики-странице закрытия вы можете найти пример, очень похожий на то, что вы пытаетесь достичь ,
Я узнал, что в Java это делается путем создания интерфейса с одним методом. В своем коде вы используете классы, реализующие этот интерфейс.
Это, очевидно, ваш призыв, но для большинства демонстраций API, которые я использовал, я предпочитаю более длинный формат, который у вас вверху. После просмотра кода я обычно выполняю копирование и вставку, чтобы убедиться, что API работает так, как я думаю, а затем изменяю его оттуда. Изменение формата, чтобы скрыть некоторые повторяющиеся части, определенно то, что вы хотите сделать для разработки OO, но я думаю, что этот своего рода демонстрационный код - это то, что «боги чистого кода» поймут :-).