2010-11-24 1 views
4

Поскольку JDK не содержит их, мильон библиотек 3 участника содержат интерфейсы действий или Func, что выглядеть примерно так:Каков стандарт де-факто для классов Action/Func?

public interface Action<T> { 
    void doSomething(T item); 
} 

public interface Func<TResult, TInput> { 
    TResult doSomething(TInput input); 
} 

Что является де-факто, или наиболее часто используемым стандарт для этого?

ответ

3

Вы можете использовать Runnable (void) или Callable (возвращая значение). Но, как вы заметили, пакеты часто создают свои собственные. Часть причины состоит в том, чтобы иметь более значимое имя, чем run или call. Вы должны заметить, что Java не имеет делегатов в стиле C#, и у него нет способа неявно конвертировать между методом и экземпляром интерфейса.

Обратите внимание, что ни один из указанных выше интерфейсов не позволяет параметры. Если вам нужно, вам понадобится другое решение.

EDIT: Я использовал Apache Functor в прошлом, и у него есть некоторые из этих интерфейсов (например, UnaryProcedure и UnaryFunction для тех, которые в вопросе). Тем не менее, я бы до сих пор считаю создание собственного, особенно, если вы что-нибудь еще из функтора не нужен (например, algorithm или adapter)

+0

Предполагается, что JDK7 (или 8?) Устранит необходимость в этих интерфейсах одного метода (и имя метода). Затем их можно заменить закрытием (которое также сможет принимать параметры). – Thilo 2010-11-24 05:12:41

+0

Извините, я не был достаточно ясен - мне также нужно передать общие аргументы. См. Отредактированный вопрос. – ripper234 2010-11-24 05:40:00

1

В то время как я не знаю ни одного интерфейса, который соответствует вашей Action<T> подписи (возможно, частично из-за такая подпись предписывает, чтобы экземпляры Action продукта побочных эффектов), Guava имеет интерфейс Function, который соответствует второй подписи, а также множество Collection и Iterable связанных утилит, которые используют Function с делать ленивое отображение (называется transform в гуавах). Это также просто отличная библиотека Java общего назначения.