1

我有一个名为 Entity 的根类。我还有对实体子类型执行 CRUD 操作的服务类。所以,我的服务类定义遵循这个模式

class Entity { 
   //the root class
}

class Service<T extends Entity> {
  //root service class containing common CRUD operations
}


class SomeEntity extends Entity {
}

class SomeService extends Service<SomeEntity> {
}

我维护一个实体类的映射——>到他们相应的服务,比如

Map<Class<? extends Entity>, Service<? extends Entity>> = serviceMap
 new HashMap<Class<? extends Entity>, Service<? extends Entity>>();

但是,上述内容并不强制该类及其对应的 Service 属于同一层次结构。因此,即使在转换之后,我的客户端代码也必须再次转换它。如何避免以下情况?并在 key 和 value 之间强制执行严格的关系?

    public <T extends Entity> Service<T> get(Class<T> clazz) {
    return (Service<T>) serviceMap.get(clazz);
    }

    //example of client code
    SomeService service = (SomeService) serviceRegistry.get(SomeEntity.class);
4

1 回答 1

0

不幸的是,你不能做你想做的事。这是不可能的!

但是,您实际上并不需要知道Service实现是什么。Service应该定义为客户端代码调用提供所有必要的方法。你好多态性!就个人而言,我只是将您的 get 方法稍微更改为:

Service<? extends Entity> getService(Class<?> entityClass) {
  return serviceMap.get(entityClass);
}

客户端代码不应该太关心实际的实现:

Service<? extends Entity> service = getService(SomeEntity.class);
service.save(myEntity);

另一种选择是,如果您在需要服务时知道实体类型是什么,那么您可以传入Service类并将其用于强制转换,例如:

<T extends Service<? extends Entity>> T getService(Class<?> entityClass, Class<T> serviceClass) {
  return serviceClass.cast(serviceMap.get(entityClass));
}

诚然,上述方法都不能保证SomeEntity.classMap.

于 2012-07-31T05:56:25.707 回答