У меня есть 2 (или более) источника данных, в которых хранится одно и то же; и я хочу написать интерфейс с методами, чтобы найти элементы в них. Пример:
public interface CarFinder {
public Car findById(String id);
}
Тогда я могу написать такой класс и использовать его:
public class CustomCarFinder implements CarFinder {
public Car findById(String id) {
...
return someCar;
}
}
...
Car aCar = customCarFinder.findById("1");
CustomCarFinder
знает, как подключиться к источнику данных и получить Car
для меня.
Проблема в том, что, в то время как для моего первого источника данных, CustomCarFinder
может подключаться к нему каждый раз, когда я звоню "findById
"; для второго источника данных клиент CarFinder
знает, как получить соединение, а не CarFinder
. Чтобы предоставить информацию о соединении CarFinder
, я написал что-то вроде этого:
public interface CarFinder {
public Car findById(String id, Object... context);
}
public class CustomCarFinder implements CarFinder {
public Car findById(String id, Object... context) {
//The Varargs (context) are not used in this version
...
return someCar;
}
}
public class AnotherCustomCarFinder implements CarFinder {
public Car findById(String id, Object... context) {
//Extract the connection here from the Varargs
CustomConnection connection = (CustomConnection)context[0];
...
//Somehow I find the car via this CustomConnection thing
return someCar;
}
}
...
Car aCar = customCarFinder.findById("1");
Car anotherCar = anotherCustomCarFinder.findById("1", aCustomConnection);
Видите ли, я использовал varargs, чтобы я мог использовать либо версию API. В первом случае, когда подключение не требуется, я все еще могу использовать:
Car aCar = customCarFinder.findById("1");
и если мне нужно предоставить соединение, то:
Car anotherCar = anotherCustomCarFinder.findById("1", aCustomConnection);
Классы Finder реализованы как Spring-синглтоны, поэтому они являются общими, и поэтому, чтобы избежать проблем с многопоточностью, они не сохраняют состояния, поэтому я не хочу устанавливать «Соединение» перед использованием методов; и именно поэтому я передаю Соединение как Varargs.
Есть ли другой способ сделать то же самое?
Я получаю откат (от коллег) от использования Varargs, что я должен просто перегрузить метод "findById
" с различными типами типов соединения.
Я сопротивляюсь этому, потому что я не хочу, чтобы интерфейс отражал типы источников данных, к которым я подключаюсь. Я хочу, чтобы интерфейс, если вообще возможно, остался:
public Car findById(String id);
Мне также не нравятся Варарги, но я не уверен, как от них избавиться и все же добиться того, чего я хочу.