2010-12-02 6 views
1

私はそうのような過負荷状態にする方法を使用していますJCRのAPIを使用しています:オブジェクト参照をインスタンスの型に自動的にキャストする方法はありますか?

setProperty(String value) 
setProperty(Boolean value) 
setProperty(Integer value) 
... 

は、私はその後StringBooleanInteger、などの事例が含まれていてもよいCollection<Object>を持っています。

このコレクションを繰り返し、それぞれの要素をそのインスタンスタイプの正しいsetProperty実装に渡したいと思います。 OOの理念から逸脱 - - 醜いであることに加えて

for (Object value : values) { 
    if (value instanceof String) node.setProperty((String) value); 
    if (value instanceof Boolean) node.setProperty((Boolean) value); 
    if (value instanceof Integer) node.setProperty((Integer) value); 
    ... 
} 

この解決策は単純にスケールしない:明白な方法は、このようなものです。この特殊なケースでは機能しますが、タイプの数が増えるにつれてすぐに扱いにくくなります。

このキャスティング操作を自動的に実行するためには、エレガントなトリックやutilが必要なような気がします。

答えて

3

通常、実行時にコンパイル時に通常実行されるオーバーロードの解決を要求しているため、そうではありません。

オプション:double dispatchをエミュレートするvisitor patternを使用する方法

  • を見つけて実行する

    • 使用反射(これはあなたのケースのために適切ではないかもしれません。私はVisitorパターンのように好きではありませんよ他の多くは、自動的にこの鋳造作業を実行するためのいくつかのエレガントなトリックやutilに存在しなければならないかのように私は本当に感じ)
  • 0

    です。

    私はあなたがそれを見つけるとは思わない。

    多くのタイプの代替(20以上)がある場合は、value.getClass()のハッシュテーブル参照を使用して、いくつかの「セッター」オブジェクトのインスタンスを提供することが理にかなっています。しかし、定型コードをたくさん書く必要があります。そのため、エレガントなIMOとはみなされません。

    反射もオプションですが、高価であり、潜在的な実行時障害モードを招きます。また、私はこの特定のケースでどのように役立つのか実際にはわかりません。

    関連する問題