It may be worth it for the empty and single element list case:

  if (hooks.size() == 0)
    return PostReceiveHook.NULL;
  if (hooks.size() == 1)
    return hooks.get(0);
  return new PostReceiveHookChain(hooks.toArray(...));

so keep the static factory method. But please fix the NPE. :-)