代码之家  ›  专栏  ›  技术社区  ›  aoyuan zhu

为什么guava joiner实现私有方法iterable(final Object first,final Object second,final Object[]rest)?

  •  1
  • aoyuan zhu  · 技术社区  · 7 年前
    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 回复  |  直到 7 年前
        1
  •  2
  •   Andy Turner    7 年前

    这里的要点是这个方法是从公共方法调用的( 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) .