2017-02-20 15 views
2

Я только начал использовать SonarQube для улучшения качества моего кода, и когда я проанализировал проект JavaFx, который использует ControlsFX для проверки, я получил эту ошибку «запах кода».Преобразование ValidationSupport лямбда-вызов метода ссылки

Заменить этот лямбда со ссылкой метод:

support.getValidationResult().getErrors().forEach(error -> 
    support.getValidationDecorator().applyValidationDecoration(error)); 

Я не уверен в том, как реорганизовать это так как класс ValidationSupport не имеет статические методы и мой IDE дает мне это предупреждение для большинства из того, что я завязывания сделать:

Тип ValidationSupport не определяет getValidationDecorator (ValidationMessage), который применяется здесь

На данный момент я только что обозначил его как ложный позитив в Sonar, но это не очень хорошее решение в долгосрочной перспективе, поскольку оно просто скрывает его.

ответ

2

Ссылки на методы не обязательно должны ссылаться на статические методы, они также могут быть ссылками на метод на конкретном объекте. В этом случае вы можете использовать:

support.getValidationResult().getErrors().forEach( 
    support.getValidationDecorator()::applyValidationDecoration); 

который делает точно то же самое, что и оригинал - вызов applyValidationDecoration с параметром ошибки в результате вызова support.getValidationDecorator().

+0

Работает отлично, спасибо. Моя ошибка заключалась в попытке использовать «::» для начала, i e support :: getValidation. – Brenin

2

Ссылки на методы введены в сокращенные выражения лямбда. Но только конкретный тип лямбда может быть сокращен с использованием этих ссылок на методы.

Если ваша лямбда не делает ничего, кроме вызова другого метода; вы можете использовать эту короткую форму (ссылки на методы) для записи этой лямбда.

В вашем случае; ваше выражение лямбда:

Consumer<Error> con = error -> 
         support.getValidationDecorator().applyValidationDecoration(error); 

Вы можете видеть, что error только перенаправлены applyValidationDecoration метода. Следовательно; это вполне допустимый сценарий для использования ссылок на методы.

support.getValidationResult().getErrors() 
.forEach(support.getValidationDecorator()::applyValidationDecoration); 

Посмотрите на Oracle tutorial, если у вас есть какие-либо сомнения.

 Смежные вопросы

  • Нет связанных вопросов^_^