В настоящее время у меня есть класс, TransactionData
, который немного больше, чем POJO. Я строю объект из HTTPServletRequest
. Что я делаю:
public class TransactionData
{
// ...
public TransactionData(HttpServletRequest request) throws IOException
{
// do actual work here
}
}
Здесь много WTF, наиболее тревожным является то, что объект TransactionData
тесно связан с HTTPServletRequest
. Что я подумал: создать интерфейс TransactionDataExtractor
с методом extract()
, чтобы я мог реализовать разные классы для создания объекта.
public interface TransactionDataExtractor
{
public TransactionData extract();
}
Но как передать материал, необходимый для построения TransactionData, каждой реализации? Первое, что пришло в голову, - это использовать различные конструкторы, например:
public class TransactionDataExtractorRequest implements TransactionDataExtractor
{
private HttpServletRequest httpRequest;
public TransactionDataExtractorRequest(HttpServletRequest httpRequest)
{
this.httpRequest = httpRequest;
}
public TransactionData extract()
{
// do whatever is required
}
}
Но в этом случае всякий раз, когда мне нужно создать новый объект TransactionData, я должен создать новый TransactionDataExtractorRequest. Неявная зависимость мне совсем не нравится.
Другой альтернативой, о которой я мог подумать, была передача параметра Object в extract()
и приведение его при необходимости, отказ от безопасности типов и введение большого количества уродливого кода котельной пластины
public TransactionData extract(Object o)
{
HttpServletRequest h;
if (o instanceof HttpServletRequest)
{
h = (HttpServletRequest)o;
}
//...
}
Я не знаю, ясно ли я объяснил. Я чувствую, что что-то упустил, я знаю, что решение очень простое, но я не могу его достать.
Какие-нибудь мысли?
ТИА.
РЕДАКТИРОВАТЬ: проблема может даже заключаться в том, что моя догадка совершенно неверна, и я могу отклонить ее без сожаления