我正在尝试为此找到一个优雅的解决方案,但无法弄清楚。
我在某个地方有一个通用数据提供者。我想调用它来获取任意对象 - 它会根据请求从缓存、服务器等获取它们。
我想这样调用它,例如:
List<Customer> customers = new DataProvider().getData(new CustomersRequest(20));
这将为我提供所有 20 岁以下的客户。DataProvider 决定如何以及在哪里获取此数据。
CustomersRequest 扩展了 Request 类。
要使 getData 正常工作,需要对 Request 实例进行instanceOf 检查,并从数据库缓存或远程提供程序调用相应的方法...类似于:
if (request instanceof CustomersRequest) {
DBDataProvider dbDataProvider = new DBDataProvider();
List<Customer> customers = dbDataProvider.getCustomers(request);
if (customers == null) {
RemoteDataProvider removeDataProvider = new RemoteDataProvider();
customers = removeDataProvider.getCustomers(request);
if (request.cacheInDB) {
//save response to db
}
return customers;
}
}
但是只有当我从此方法返回一个 Object
时才有效 - 这会让我每次调用它时都进行强制转换。不过,我认为这是合适的解决方案,因为我将返回的数据也基于我在内部进行的转换。
据说 的实例很糟糕。
我找不到用泛型解决这个问题的方法。
我还可以这样做:
List<Customer> customers = new DataProvider().getCostumers(20);
但这意味着,我必须在 DataProvider 中为所有不同的对象和参数创建许多方法,并且在每个方法中调用一个通用方法,该方法将进行缓存检查和其他操作。使用这种通用方法,我遇到了与第一种方法相同的问题。
或者也:
List<Customer> customers = new CustomersDataProvider().getCostumers(20);
在这里,我对实例和泛型不再有任何问题,因为它不再是泛型了。但不确定我是否可以正确抽象这一点,以便在 1 个位置获得所有可能数据的缓存访问和验证。
最好的方法是什么?
最佳答案
在这种情况下,Class
类很有用。你可以使用这样的方法:
List<Customer> customers = new DataProvider().getCostumers(20, Customer.class);
您的方法的签名类似于:
T getCostumer(int age, Class<T> clazz)
关于从提供者获取任意数据的 Java 通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17809008/