У меня есть два фабричных метода, которые производят потребителей, используют разные подходы ???????? лямбда и ссылки на методы:
@SuppressWarnings("Convert2MethodRef")
public Consumer<String> lambdaPrintStringConsumer(){
return x -> System.out.println(x);
}
public Consumer<String> methodRefPrintStringConsumer(){
return System.out::println;
}
Я обнаружил, что в первом случае (lambdaPrintStringConsumer()
) метод возвращает ссылку на тот же объект
@Test
public void shouldSameFromFactoryMethod_lambda() {
Consumer<String> consumerA = lambdaPrintStringConsumer();
Consumer<String> consumerB = lambdaPrintStringConsumer();
Assert.assertSame(consumerA, consumerB);//consumerA == consumerB --> true
}
но во втором (methodRefPrintStringConsumer()
) объекты разные
@Test
public void shouldNotSameFromFactoryMethod_methodRef() {
Consumer<String> consumerA = methodRefPrintStringConsumer();
Consumer<String> consumerB = methodRefPrintStringConsumer();
Assert.assertNotSame(consumerA, consumerB);//consumerA == consumerB --> false
}
прямой подход возвращает тот же результат, что и shouldNotSameFromFactoryMethod_methodRef()
:
@SuppressWarnings("Convert2MethodRef")
@Test
public void shouldNotSameFromLambda() {
Consumer<String> consumerA = s -> System.out.println(s);
Consumer<String> consumerB = s -> System.out.println(s);
Assert.assertNotSame(consumerA, consumerB);//consumerA == consumerB --> false
}
, затем я протестировал фабричный метод со ссылкой на другой статический метод
public class FunctionalInterfaceTest {
public static Consumer<String> methodRefFromStaticMethodStringConsumer() {
return FunctionalInterfaceTest::print;
}
public static void print(String string) {
System.out.println(string);
}
...
}
и получим тот же результат, что и в первом тесте (lambdaPrintStringConsumer
):
@Test
public void shouldSameFromFactoryMethod_methodRef() {
Consumer<String> consumerA = methodRefFromStaticMethodStringConsumer();
Consumer<String> consumerB = methodRefFromStaticMethodStringConsumer();
Assert.assertSame(consumerA, consumerB );//consumerA == consumerB --> true
}
В чем хитрость❓
В тестах ???????? jdk-11.0.1
и jdk-13.0.1
.