我有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");

10-07 13:42