Хотя это еще не относится к Java 7 и ниже, я считаю, что мы должны смотреть в будущее и, по крайней мере, признать изменения , которые появятся в новых версиях, таких как Java 8.
А именно, эта новая версия приносит лямбды и ссылки на методы на Java (вместе с новыми API , которые являются еще одним допустимым решением этой проблемы. Хотя им все еще не требуется интерфейс, нет новых объектовсоздаются, и дополнительные файлы классов не должны загрязнять выходные каталоги из-за разной обработки JVM.
Для обоих вариантов (лямбда и ссылка на метод) требуется интерфейс, доступный для одного метода, чья сигнатура используется:
public interface NewVersionTest{
String returnAString(Object oIn, String str);
}
Имена методов здесь не будут иметь значения. Там, где принимается лямбда, также указывается ссылка на метод. Например, для использования нашей подписи здесь:
public static void printOutput(NewVersionTest t, Object o, String s){
System.out.println(t.returnAString(o, s));
}
Это простопростой вызов интерфейса, до тех пор, пока не будет принята лямбда 1 :
public static void main(String[] args){
printOutput( (Object oIn, String sIn) -> {
System.out.println("Lambda reached!");
return "lambda return";
}
);
}
Будет выведено:
Lambda reached!
lambda return
Ссылка на методRences похожи.Дано:
public class HelperClass{
public static String testOtherSig(Object o, String s){
return "real static method";
}
}
и главное:
public static void main(String[] args){
printOutput(HelperClass::testOtherSig);
}
, результат будет real static method
. Ссылки на методы могут быть статическими, экземплярами, нестатическими с произвольными экземплярами и даже конструкторами .Для конструктора будет использоваться что-то похожее на ClassName::new
.
1 Это не считается лямбда, поскольку имеет побочные эффекты.Однако это иллюстрирует использование одного из них более простым для визуализации способом.