2016-04-14 14 views
1

式言語豆特性評価順

MyBeanクラスには、getName()メソッドが含まれています。

XPageには#{MyBean.name}と評価される値があります。

MyBean.getValue( "Name")を呼び出し、MyBean.getName()を無視しています。私の質問は、この正しい操作ですか?

論理的には、一般化されたgetValue( "Name")を試す前に、より具体的なgetName()を試す必要があるようです。いくつかの研究をすると、getValue()がnullを返すと、特定のゲッターを探すと思われます。論理が疑わしいと思っても、少なくとも正しい結果が得られます。しかし、どちらも起こっていません。この回避策が必要でなければなりませんようにそれはいないようです

public Object getValue(final Object key) { 
    /* Following code added to check for specific getter before performing getValues() */ 
    String propertyName = key.toString(); 
    propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); 
    Method method = null; 
    try { 
     method = this.getClass().getMethod("get" + propertyName, new Class[] {}); 
     if (method != null) { 
      return method.invoke(this); 
     } 
    } catch (Exception e) { 
     // Do nothing 
    } 
    try { 
     method = this.getClass().getMethod("is" + propertyName, new Class[] {}); 
     if (method != null) { 
      return method.invoke(this); 
     } 
    } catch (Exception e) { 

    } 
    /* --------------------------------------------- */ 
    return getValues().get(key); 
} 

、私は何が起こっているのいくつかの基本的な誤解を持っている場合、私は思ったんだけど:

は、私は次のコードで問題を解決してきました。代わりに、私はこれを行うべきであるいくつかのより良い方法はありますか?

+1

私はずっとそれを見ていませんが、Tim Tripconyはノーツイン9のビデオを作成し、正しく覚えていればこの正確な問題について話しました。基本的にTimが提案したものが最良の解決策です。 –

+0

私がやっていることはティムの仕事から得たものです。私はそのNI9をしばらく見直していないので、これがどのように機能するかを誤って思い出したと思います。ありがとう! –

答えて

2

ELはしばしば役に立つと思うので、そのような "フォールバック"戦略はありません。代わりに、それは - MapDataObjectなど(私は特定の順序を覚えていません)を循環するインターフェイスのセットを持っています - オブジェクトがそれらのいずれかと一致する場合、そのルートを排他的に使用します。あなたがそこで何をしたかは、反射を伴って、私がその行動を起こすのに使ったのと同じ戦略です。

+0

仮に、新しいハンドラをリストの先頭に登録して、オブジェクトを取得し、それに対する「フォールバック」命令を行うことができますが、それはおそらくそれが価値があるにはあまりにもハッキリでしょう。 –

+0

私は最小のハック感をコード化しようとしています。だから私はこの方法に固執すると思います。パフォーマンスが悪いなど、このようにしない理由がありますか?私はそれが抽象クラスに属しているかどうか、あるいはケースバイケースでその振る舞いをオーバーライドする必要があるかどうかを判断しようとしています。 getValueをオーバーライドして特定のキーを探し、マップから値を検索するのではなくメソッドを返すことができます。しかし、そのコードは本当に醜いだろう。 –

+1

実際の問題になるまでは、リフレクションのパフォーマンスを心配する大きな理由はありません。たとえば、リフレクションは整数テストに比べて遅いですが、データベース関連のものと比べて非常に高速です。私はこの道をしばらく使っていて、それについて二度考えなくてもいた。それが遅すぎると判明した場合は、「特定のキーを確認する」ルートが必要です。これがDominoViewEntryのようなIBMのオブジェクトです。 –