从提供者获取任意数据的 Java 通用方法

标签 java oop design-patterns

我正在尝试为此找到一个优雅的解决方案,但无法弄清楚。

我在某个地方有一个通用数据提供者。我想调用它来获取任意对象 - 它会根据请求从缓存、服务器等获取它们。

我想这样调用它,例如:

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/

相关文章:

java - 为什么 @ApiModelProperty 注释的 "example"属性中有多余的反斜杠?

java - 确定数组是否包含两个等于某个和的元素?

java - 匿名类如何访问父类的参数?

php - 在 PHP 中让对象随处可用的首选方式是什么?

java - 自定义对象中的方法应该具有破坏性吗?

c# - 具体类实现中的 IEnumerable 与 List

java - JAXB:如何将元素与命名空间绑定(bind)

oop - 适配器模式和依赖

java - 工厂方法模式返回 void

c++ - C++中的装饰器模式