I have 2 (or more), datasources which store the same thing; and I want to write an interface with methods to find items in them. Example:
public interface CarFinder {
public Car findById(String id);
}
Then I can write a class like this and use it:
public class CustomCarFinder implements CarFinder {
public Car findById(String id) {
...
return someCar;
}
}
...
Car aCar = customCarFinder.findById("1");
CustomCarFinder knows how to connect to the datasource and retrieve the Car for me. The problem is that whereas for my first datasource, the CustomCarFinder can get a connection to it every time I call "findById"; for the second datasource it is the client to the CarFinder that knows how to get the connection, not the CarFinder. To supply the connection information to CarFinder I wrote something like this:
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);
You see I used varargs so that I can use either or version of the API. In the first case where the connection does not have to be supplied I can still use:
Car aCar = customCarFinder.findById("1");
and if I need to supply the connection then:
Car anotherCar = anotherCustomCarFinder.findById("1", aCustomConnection);
Is there another way of doing the same thing? I am getting pushback ( from colleagues ), on the use of Varargs, that I should just overload the "findById" method with the different types of Connection types. I am resisting this, because I don't want the interface to reflect the types of datasources I am connecting to. I want the interface, if at all possible to remain:
public Car findById(String id);
I also don't like the Varargs, but I am not sure how to get rid of them and still accomplish what I want.
Aucun commentaire:
Enregistrer un commentaire