. У меня есть сервлет, который при передаче параметров запроса получает список объектов из DAO, преобразует список в JSON и отправляет обратно в ответ. Каждый список состоит из объектов, у которых есть метод:
public String getAsJson(){...}
И у сервлета есть куча в основном одинаковых методов, которые выглядят как:
private String getUserListAsJson() {
List<User> userList = this.dao.getUsers();
StringBuilder builder = new StringBuilder();
builder.append('[');
// loops over the list appending the value of each objects getAsJson()
builder.append(']');
return builder.toString();
}
Проблема в том, что у меня есть около 6 методов (и растущие), которые выглядят точно так же, как это, за исключением различных запросов DAO. Моя идея заключалась в том, чтобы создать интерфейс, в котором было бы определение только для метода getAsJson(), сделать так, чтобы каждый bean-компонент реализовал его, а затем иметь в сервлете еще один метод, который принимал бы объекты, реализующие этот интерфейс. В итоге получилось вот так:
public Interface JsonEnabled {
public String getAsJson();
}
public class User implements JsonEnabled {
....
@Override
public String getAsJson() {...}
}
public class TheServlet {
...
private String getUserListAsJson() {
List<User> userList = this.dao.getUsers();
return this.getListAsJson(userList);
}
private String getListAsJson(List<? implements JsonEnabled> list) {
// The loop code that is in each method.
}
}
Итак, если кто-то действительно дочитал до этого места =P, который не компилируется, и после поиска документации от Oracle вы можете иметь только расширения , а не реализации для общих параметров. Расширение всех классов от абстрактного класса, который имеет только метод getAsJson(), не имеет смысла семантически (, классы не связаны).
Я не нашел хорошего решения на SO или просто погуглил, поэтому буду признателен за любую помощь/понимание.