1

InvocationHandlerJavaとProxyクラスを使用してノーオペレーションの「リスナー」を作成しようとしています。以下の実装がすべてのシナリオを処理できるかどうか、またそれが最適なソリューションであるかどうかはわかりません。私が本当に望んでいるのは、このクラスが影響を与えないことです。以下よりもこの概念を表現するより良い方法はありますか?

public class EmptyListener {
  public static <T> T createEmptyListenerFor(Class<T> aInterface) throws Exception {
    return (T) Proxy.newProxyInstance(aInterface.getClassLoader(), new Class[] { aInterface }, new EmptyInvocationHandler());
  }

  private static class EmptyInvocationHandler implements InvocationHandler {
    public EmptyInvocationHandler() {}
    @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      Class<?> returnType = method.getReturnType();
      if (returnType.isPrimitive()) {
        if (returnType.equals(boolean.class)) {
          return false;
        } else if (returnType.equals(void.class)) {
          return null;
        } else if ( returnType.equals(byte.class)) {
          return (byte)0;
        } else if ( returnType.equals(short.class)) {
          return (short)0;
        } else if ( returnType.equals(int.class)) {
          return 0;
        } else if ( returnType.equals(long.class)) {
          return 0l;
        } else if ( returnType.equals(float.class)) {
          return 0f;
        } else if ( returnType.equals(double.class)) {
          return 0d;
        } else if ( returnType.equals(char.class)) {
          return '\u0000';
        }
      }
      return null;        
  }
}

おそらく、私はここで間違ったツリーを吠えています。繰り返しになりますが、これは、リスナー インターフェイスの初期化時にサロゲート、プレースホルダー、またはNull オブジェクトを簡単に作成できるようにすることを目的としています。ここでの考え方は、このリスナーを注入して、null参照への偶発的な呼び出しを防ぐことができるということです。私がここでやろうとしていることを達成するためのより良い方法はありますか? または、私が知らないオープン ソース プロジェクトで誰かが似たようなことを書いたことがありますか? 私はグアバのことを知ってOptionalいますが、それは私が本当に望んでいるものではありません.

4

1 に答える 1

0

コンテキストによっては、これは JVM によってインライン化できない可能性があるため、コストが高くなる可能性があります。Java サーバーでこれを実行している場合、インライン化は重要であり、permgen のサイズは重要ではありませんが、Android でこれを実行している場合、インライン化はあまり重要ではありませんが、permgen のサイズ (というか、すべての冗長なメソッドは重要ではありません)これらすべての役に立たない空の実装の結果) が問題になります。

これが Java サーバー上にある場合は、おそらく、必要なすべての空の実装を自動的に生成できる注釈プロセッサを作成できます。

ただし、どこでも注釈を使用し、使用前にチェック@Nonnullを強制します。null

于 2016-03-18T19:32:34.537 に答える