如何在没有方法重载的情况下编写通用Java API



我有两个(或更多(数据源,它们存储相同的东西;我想写一个接口,其中包含查找其中项目的方法。示例:

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。问题是,对于我的第一个数据源,每次我调用"findById"时,CustomCarFinder都可以连接到它;对于第二个数据源,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 singleton,因此它们是共享的,因此为了避免线程问题,它们是无状态的,所以我不想在使用这些方法之前设置"Connection";这就是为什么我以Varargs的身份传递Connection。

还有其他方法可以做同样的事情吗?关于Varargs的使用,我受到了(同事们(的反对,认为我应该用不同类型的Connection类型重载"findById"方法。我反对这样做,因为我不希望接口反映我正在连接的数据源的类型。如果可能的话,我希望接口保持不变:

public Car findById(String id);

我也不喜欢瓦拉戈一家,但我不知道如何摆脱他们,并实现我想要的。

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

我假设您可以使用Java 8。

如果您不喜欢Varargs,可以将Supplier传递给该方法,如下所示:

interface CarFinder {
Car findById(String id, Supplier<Object> sup);
}
class CustomCarFinder implements CarFinder {
public Car findById(String id, Supplier<Object> sup) {
// ignore the sup
// and the rest
}
}
class AnotherCustomCarFinder implements CarFinder {
public Car findById(String id, Supplier<Object> sup) {
CustomConnection conn = (CustomConnection)sup.get();
// and the rest
}
}

现在你可以使用它们了:

customCarFinder.findById("1", () -> null);
anotherCustomCarFinder.findById("1", () -> customConnection);

如果你也不喜欢null(我想(,你可以通过dummyConnection

相关内容

  • 没有找到相关文章

最新更新