#java #lambda #instanceof
#java #лямбда #instanceof
Вопрос:
пожалуйста, есть ли способ сделать код более кратким — чтобы избежать повторения похожих / одинаковых действий — у меня есть метод, выполняющий проверки объектов, но большинство параметров похожи / одинаковы, например, используя для этого какое-то лямбда-выражение, но объекты не из одного дерева.
Мой вариант использования такой:
validate.( car );
и где-то еще я делаю:
validate.( person );
Прямо сейчас я выполняю проверку следующим образом:
public boolean validate( Object obj ) {
if ( obj instanceof Car ) {
Car car = (Car) obj;
if ( car.getAge() <= 0 ) return false;
// many other checks which are repeated below
} else if ( obj instanceof Person ) {
Person person = (Person) obj;
if ( person.getAge() <= 0 ) return false;
// many other check which are repeating those above
}
// here I would like to do checks for both objects, but objects are from different roots
return true;
}
Ответ №1:
Вы можете использовать перегрузку метода :
public boolean validate(Car car) {
if ( car.getAge() <= 0 ) return false;
return validate((Master)car);
}
public boolean validate(Person p) {
if ( p.getAge() <= 0 ) return false;
return validate((Master)p);
}
public boolean validate(Master m) {
// common validations
return true;
}
Master является общим родителем Person и Car (я предполагаю, что существует общий родительский интерфейс / класс).
Ответ №2:
«Не»s:
- Прежде всего, я бы строго посоветовал вам стараться изо всех сил избегать разработки вашего метода, как вы это делаете сейчас;
Person
иCar
не имеет ничего общего с логической, моделирующей или концептуальной точки зрения. И они не имеют каких-либо схожих характеристик в реальной жизни;- Не принимайте
Object
в качестве аргумента в вашем методе. Вам будет трудно управлять своими ошибками и / или поддерживать непредсказуемое поведение.
«Do»s:
- Определите свой метод, следуя принципу единой ответственности;
- Рассмотрим с точки зрения вашего объекта модели — каким должен быть ваш метод в качестве поведения? какую проблему он должен решить?
- Попробуйте разделить проблемы в их соответствующих классах / файлах / блоках и постарайтесь не перекрывать их.
Если вы хотите, чтобы ваш метод работал на основе фактического экземпляра аргумента, лучший способ — использовать instanceof
проверки.
Однако вместо этого вы можете создать некоторое правильное наследование и принять супертип в качестве аргумента метода. Тогда включится полиморфизм, и у вас будет только одна логика в вашем методе.
Комментарии:
1. Спасибо, это сущности, и моя модель, вероятно, не оптимальна, поэтому я создам абстрактный суперкласс, и оба объекта унаследуют его.