Имеет ли смысл использовать интерфейс, когда есть разные универсальные типы - PullRequest
1 голос
/ 10 октября 2019

Использование интерфейса - хороший подход для создания абстракции, и я обычно стараюсь использовать его, если это возможно. Но на этот раз у меня немного другой случай, и я не уверен, что это хорошая практика.

У меня есть два разных класса, которым нужен какой-то метод запроса с одинаковой сигнатурой. Скажем, MyString и MyInteger.

Я думал определить интерфейс одним методом:

public interface MyInterface{

   // no type is specified for the list, because each implementation will have different type of object
   List query();  
}

Так что в основном мне нужно реализовать два разных класса, которые реализуют интерфейс выше. Первый получит List<String>, а второй получит List<Integer> результат от метода запроса.

Дело в том, что мне не нравится не указывать универсальный тип в интерфейсе, потому что мне нужно будет привестипотом.

Так имеет ли смысл использовать здесь интерфейс или лучше реализовать два отдельных класса с одинаковой сигнатурой метода без общего интерфейса?

1 Ответ

3 голосов
/ 10 октября 2019

Дело в том, что мне не нравится не указывать универсальный тип в интерфейсе ...

Именно так вы и обращаетесь к этому.

КогдаМне нужно получить объект из списка, скажем, Integer x = (Integer) list.get (index);Это всего лишь пример, на самом деле я использую пользовательский объект.

Весь смысл обобщений в том, что вам не нужно делать это. Вместо этого:

public interface MyInterface<T> {
    List<T> query();  
}

public class MyInteger implements MyInterface<Integer> {
    // ...
}

// ...
MyInteger foo = new MyInteger();

// ...
List<Integer> list = foo.query();

// ...
Integer i = list.get(index);

Или с var, так как он уже давно используется в языке:

// ...
var foo = new MyInteger();

// ...
var list = foo.query();

// ...
var i = list.get(index);

Так имеет ли смысл использовать интерфейс здесь, илиЛучше реализовать два отдельных класса с одинаковой сигнатурой метода без общего интерфейса?

Это зависит. Если у вас будет несколько классов, которые будут реализовывать MyInterface<Integer>, и вам нужно иметь дело с экземплярами этих классов обычным способом (например, чтобы вы ссылались на них с MyInterface<Integer>, а не с классом) и / или если MyInterfaceпредставляет некоторый базовый аспект вашей общей структуры, тогда, вероятно, имеет смысл использовать интерфейс. Если вы этого не сделаете, если у вас будет два разных класса с методами List<something> query, это может быть не так. Это зависит от общего дизайна и (немного) от стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...