Композиция вместо наследования в Java
Наследование удобно не всегда. Если классу нужна только часть чужого поведения, часто проще сохранить помощника в поле. Сделаем класс для проверки текста:
class TextChecker {
boolean isLong(String text) {
return text.length() > 10;
}
}
Теперь сделаем класс записи. Он не наследуется от проверяющего класса, а хранит его объект внутри себя:
class Post {
private String text;
private TextChecker checker;
Post(String text, TextChecker checker) {
this.text = text;
this.checker = checker;
}
}
Добавим метод, который использует помощника. Класс
Post остается самостоятельным, но получает
нужное поведение:
boolean hasLongText() {
return checker.isLong(text);
}
Проверим работу композиции:
TextChecker checker = new TextChecker();
Post post = new Post("Hello Java world", checker);
System.out.println(post.hasLongText());
Сделайте класс SalaryChecker с методом,
который проверяет, что зарплата больше нуля.
Сделайте класс Employee, который хранит
SalaryChecker в поле и использует его при
проверке зарплаты.