Начитался теории по java и теперь какая-то каша в голове, прошу немного помочь и объяснить =)
Проблема каши - отсутсвие опыта, естественно. Конкретная область - абстрактные классы и интерфейсы. В тырнетах пишут что абстрактный/статический класс - слабое место в архитектуре приложения (почему - не до конца понял), что тру ооп это интерфейсы.
Ок. А что если у меня с десяток классов будут воплощать допустим интерфейс Datable, у которого должны быть методы setDate1/getDate1 и setDate2/getDate2. Писать для каждого класса тривиальные методы установки поля дата из входной даты вроде и не сложно, но не гуд с точки зрения DRY. Хорошо было бы вынести в абстрактный класс Dated и от него наследовать мои классы. Но что если понадобится в половине классов что то еще ввести, а в другой нет. Расширять класс Dated - не гуд, получится лишний код/поля для другой половины. Вводить класс, которым расширять Dated - тоже как то палево. С одной стороны во всех классах менять объявление того, какой метод расширяем (ну ок, это-то не самое страшное). С другой стороны - такая практика может привести к тому что создастся дерево абстрактных классов, некоторые ветки которых реально реализовать будет 1 класс только (что имхо оверкилл и усложнение необоснованное структуры).
Решение с абстрактными классами кажется более простым - начинаем с самого мелкого Id класса и пошли дальше добавлять title, date1 и тд. Но смысл интерфейсов тогда вообще?
Судя по апи BGBilling в ru.bitel.common.model идет последовательное наследование как раз таки классов id,itttle и так далее, хотя еще куча методов воплощает различные интерфейсы, допустим Contractable.
Или общий код для различных классов одного интерфейса можно в какие то статические методы утилитного класса вынести? По своему опыту - как найти баланс между обязательствами интерфейсов и использованием общего кода наследуемого класса?
updпочитал про всякие практики и паттерны используемые, посмотрел что АПИ бгбиллинговское представляет...
Первое это вложенные классы. По идее ведь можно объявить в интерфейсе вложенный класс и общий код вынести туда. Это не избавляет от необходимости создавать методы объявленные в интерфейсе, но сводит их к вызову метода внутреннего класса.
Код:
interface Dated{
public static class DateSetter{
public static void setDate(Date date,String dateToSet){
date=TimeUtils.convertStringToDate(dateToSet);
}
setDate(String date);
}
public class Example implements Dated{
private Date date;
public void setDate(String date){
Dated.DateSetter.setDate(this.date,date);
}
}