Создать No-op InvocationHandler

Я пытаюсь создать не слушающий "слушатель", используя Java InvocationHandler а также 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 ссылка. Есть ли лучший способ сделать то, что я пытаюсь сделать здесь? Или кто-то написал нечто подобное в проекте с открытым исходным кодом, о котором я не знаю? Я знаю о гуаве Optional но это не совсем то, чего я хочу.

1 ответ

В зависимости от контекста это может дорого обойтись, потому что JVM не может встроить его. Если вы делаете это на Java-сервере, будет иметь значение встроенная функция, а размер permgen - нет, но если вы делаете это на Android, встроенная функция может иметь не большое значение, а размер permgen (или, скорее, все избыточные методы, которые результат от всех этих бесполезных пустых реализаций) будет иметь значение.

Если это на сервере Java, вы, вероятно, могли бы написать процессор аннотаций, который мог бы автоматически генерировать все пустые реализации, которые вам могут понадобиться.

Тем не менее, я бы просто использовал @Nonnull аннотации везде, и заставить null проверьте перед использованием.

Другие вопросы по тегам