Абстракция характеристик - это не что иное, как содержащее в себе характеристики объектов определенного класса.

Допустим, у нас есть простой класс,

И давайте перейдем в нашу воображаемую страну, где все Личности являются либо мужчинами, либо женщинами. И если возраст мужчины и женщины старше 20 и 18 лет соответственно, он считается майором.

Давайте подойдем к этой проблеме с помощью традиционных петель,

Немного лучше с обычными потоками Java 8,

Однако после извлечения Predicate это может выглядеть еще лучше.

Теперь мы сделали все, что можем, с Streams. Но у этого подхода есть одна оговорка. Это место, где мы определили isMajor() метод. Это определение характеристики Person объектов и в идеале должно присутствовать в Person классе. Итак, наш обновленный класс Person будет выглядеть так

Возможно, это небольшое изменение. Но это приводит к поразительному снижению сложности кода и сокращению обслуживания кода. Предположим, что теперь вы хотите изменить возраст совершеннолетия лица женского пола с 18 на 20. Для этого просто потребуется изменить класс Person и больше нигде в вашей кодовой базе.

Кроме того, наш код выглядит намного аккуратнее.

Кроме того, это поможет в целом с наследованием. У нас будет класс Engineer extends Person. Теперь, если вы хотите изменить isMajor() только для инженеров, все, что нам нужно сделать, это переопределить метод isMajor() в классе Person.

Итак, впредь, если вы видите какую-либо характеристику, общую для всех объектов определенного класса, пожалуйста, начните размещать ее внутри класса.

Кроме того, трижды подумайте, прежде чем создавать служебные классы, PersonUtility.java, чтобы сделать это. Создание служебных классов вместо характерной абстракции - неправильная тенденция / шаблон.

Разве это не выглядит неуклюжим / неестественно для чтения? Возможно, вы захотите проверить, что isMajor делает в PersonUtility, потому что это отдельный класс и может делать все, что угодно! Кроме того, это будет совсем другая история, которую сложно объяснить, если нескольким унаследованным классам нужно переопределить поведение isMajor(), а наш PersonUtility просто испорчен на всю жизнь. 😂

Итак, не более того. Не меньше. Просто абстрагируйте это правильно! 😊