Мой новый коллега, который просматривал какой-то код, который я написал, сказал мне, что она не привыкла видеть интерфейсы, используемые непосредственно в Java-коде, например:
public interface GeneralFoo { ... }
public class SpecificFoo implements GeneralFoo { ... }
public class UsesFoo {
GeneralFoo foo = new SpecificFoo();
}
вместо этого, ожидая увидеть
public interface GeneralFoo { ... }
public abstract class AbstractFoo implements GeneralFoo { ... }
public class SpecificFoo extends AbstractFoo { ... }
public class UsesFoo {
AbstractFoo foo = new SpecificFoo();
}
Я вижу, когда этот шаблон имеет смысл, если все функции SpecificFoos разделяют функции AbstractFoo, но если различные Foos имеют совершенно разные внутренние реализации (или нам все равно, как конкретный Foo делает Bar, если он это делает), есть ли вред в использовании интерфейса непосредственно в коде? Я понимаю, что это, вероятно, томатная/томатная вещь в некоторой степени, но мне любопытно, есть ли преимущество во втором стиле или недостаток первого стиля, который мне не хватает.