#java #generics
Данный вопрос возник из-за спо... дискуссии с коллегой, что именно предпочтительнее. Есть код, который можно записать двумя способами: 1 Способ: public interface MyInterface{ T function(T prm); } и 2 Способ: public interface MyInterface { T function(T prm); } Реализация интерфейса один класс MyInterfaceImpl (так же с Generic у класса или метода), класс создается с помощью Spring DI в конструкторах классов, то есть: 1 Способ: public class OtherClass { private final MyInterface str; @Inject public OtherClass(MyInterface str) { this.str = str; } 2 Способ: public class OtherClass { private final MyInterface str; @Inject public OtherClass(MyInterface str) { this.str = str; } В принципе сама по себе реализация обоими способами не проблема. Вопрос в правильности, плюсах и минусах каждого подхода. Если сможете приведите цитаты Oracle документации или известных авторов по этому вопросу (я пока не нашел хороших). Update: Еще раз о условиях: 1. у интерфейсов и классов только один метод, 2. в каждом классе, где он используется интерфейс/метод работает только с одним типом, 3. оба варианта использовать в принципе можно.
Ответы
Ответ 1
И так, и так правильно, вы должны смотреть на то, какой смысл вашего класса. То есть, вы должны программировать ваши классы так, чтобы их дизайн соответствовал предметной области. Например, если у вас есть универсальный завод по производству оружия, то у вас он один, а типов оружия может производить много: public class WeaponFactory { publicT produce() { ... } } А если у вас станок, который выпускает один тип оружия, то этот тип — «параметр» самого станка, и его разновидность выпускаемого оружия предпределена: public class WeaponMachine { public T make() { ... } } Смотрите на семантику ваших классов. У меня нет подтверждающих источников, но я думаю, это и есть один из центральных, обычно не проговариваемых вслух принципов ООП. У нас есть много вариантов разбить ответственность между различными методами и группами методов. Некоторые из них приводят к проблемам. (Например, ответственность за какие-то действия может по ошибке не достаться никакому из объектов.) Так вот, идея состоит в следующем: если писать объекты и раздавать полномочия так, что это соответствовало умениям и действиям объектов в реальной жизни (то есть, в предметной области), то тут шансов для проблем меньше. Потому что ведь в реальной жизни такая схема работает? Значит и в программе должна работать. А если что-то не получается, мы можем сравнить наш код с «работающей моделью» из реальности, и посмотреть, какой части информации нам не хватает. Ответ 2
Если вы хотите чтобы класс который будет наследовать Ваш интерфейс работал только с одним типом тогда MyInterfaceподходит больше, так как крайне не удобно будет использовать дженерик методы если класс будет работать только с одним типом, Вам надо будет каждый раз явно указать тип с помощью Но если вы хотите чтобы класс который будет наследовать Ваш интерфейс работал с разными типами тогда лучше пользоваться дженерик методами. Хорошим примером будет java.util.List. В нем есть методы которые используют тип дженерика (boolean add(E e);, E set(int index, E element);), и дженерик методы ( T[] toArray(T[] a);) и и другие.
Комментариев нет:
Отправить комментарий