Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Что правильнее Java Generic Interface и Generic Methods в данном случае?

#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 { public T 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);) и и другие.

Комментариев нет:

Отправить комментарий