为什么guava joiner实现了一个可迭代的私有方法(final Object first,final Object second,final Object [] rest)?

时间:2018-01-18 16:41:54

标签: java guava iterable joiner

private static Iterable<Object> iterable(
        final Object first, final Object second, final Object[] rest) {
    checkNotNull(rest);
    return new AbstractList<Object>() {
        @Override
        public int size() {
            return rest.length + 2;
        }

        @Override
        public Object get(int index) {
            switch (index) {
                case 0:
                    return first;
                case 1:
                    return second;
                default:
                    return rest[index - 2];
            }
        }
    };
}

作者的目的是什么?

我猜他想利用编译器生成的数组,而不是新的ArrayList。

但仍然是一个令人困惑的观点,为什么不写下面的内容?

private static Iterable<Object> iterable(final Object[] rest) {
    checkNotNull(rest);
    return new AbstractList<Object>() {
        @Override
        public int size() {
            return rest.length;
        }

        @Override
        public Object get(int index) {
            return rest[index];
        }
    };
}

1 个答案:

答案 0 :(得分:2)

这里的要点是这个方法是从公共方法调用的,看起来像(source):

  public final String join(
      @NullableDecl Object first, @NullableDecl Object second, Object... rest) {
    return join(iterable(first, second, rest));
  }

使用这样的签名是一种强制你传递至少两个参数的技巧 - 毕竟,如果你没有两个参数,就没有什么可以加入。

例如:

Joiner.on(':').join();  // Compiler error.
Joiner.on(':').join("A");  // Compiler error.
Joiner.on(':').join("A", "B");  // OK.
Joiner.on(':').join("A", "B", "C");  // OK.
// etc.

iterable方法只创建Iterable,而无需将所有内容复制到新数组中。这样做的参数数量为O(n);这里采用的方法是O(1)