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 が同じ階層に属していることを強制するものではありません。したがって、キャストした後でも、クライアント コードは再度キャストする必要があります。以下を回避するには?そして、キーと値の間に厳密な関係を強制しますか?

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

もう1つのオプションは、サービスが必要なときにエンティティタイプがわかっている場合は、Serviceクラスを渡してキャストに使用できます。例:

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

確かに、上記のメソッドはどちらも、SomeEntity.classのSomeServiceインスタンスとペアになっていることを保証しませんMap

于 2012-07-31T05:56:25.707 に答える