我有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或API版本。在不必提供连接的第一种情况下,我仍然可以使用:
Car aCar = customCarFinder.findById("1");
如果我需要提供连接,则:
Car anotherCar = anotherCustomCarFinder.findById("1", aCustomConnection);
Finder类是作为Spring单例实现的,因此它们是共享的,因此为避免线程问题,它们是无状态的,因此我不希望在使用方法之前设置“连接”;这就是为什么我将Connection作为Varargs传递的原因。
还有另一种做同样事情的方法吗?
关于Varargs的使用,我得到了很多同事的回馈,我应该使用不同类型的Connection类型重载“
findById
”方法。我拒绝这样做,因为我不希望该接口反映我连接到的数据源的类型。我希望该接口尽可能保留:
public Car findById(String id);
我也不喜欢Varargs,但是我不确定如何摆脱它们,仍然完成我想要的事情。
最佳答案
Varargs在需要时很好,尽管在这种情况下,我认为最好为连接设置一个setter。
要在线程之间共享此内容,可以使用
public class AnotherCustomCarFinder implements CarFinder {
private Pool<CustomConnection> connectionPool;
public void setConnectionPool(Pool<CustomConnection> connectionPool) {
this.connectionPool = connectionPool;
}
public Car findById(String id) {
CustomConnection connection = connectionPool.acquire();
//Somehow I find the car via this CustomConnection thing
connectionPool.release(connection);
return someCar;
}
}
这样你可以写
Car aCar = customCarFinder.findById("1");
Car anotherCar = anotherCustomCarFinder.findById("1");