Java 为什么guava joiner实现了私有方法iterable(final Object first,final Object second,final Object[]rest)? 私有静态Iterable Iterable( 第一个最终对象,第二个最终对象,最后对象[]剩余){ checkNotNull(rest); 返回新的AbstractList(){ @凌驾 公共整数大小(){ 返回rest.length+2; } @凌驾 公共对象get(int索引){ 开关(索引){ 案例0: 先返回; 案例1: 返回第二; 违约: 返回休息[指数-2]; } } }; }

Java 为什么guava joiner实现了私有方法iterable(final Object first,final Object second,final Object[]rest)? 私有静态Iterable Iterable( 第一个最终对象,第二个最终对象,最后对象[]剩余){ checkNotNull(rest); 返回新的AbstractList(){ @凌驾 公共整数大小(){ 返回rest.length+2; } @凌驾 公共对象get(int索引){ 开关(索引){ 案例0: 先返回; 案例1: 返回第二; 违约: 返回休息[指数-2]; } } }; },java,guava,iterable,joiner,Java,Guava,Iterable,Joiner,作者的目的是什么 我猜他想利用编译器生成的数组,而不是新的ArrayList 但还是有一点让人困惑,为什么不写下面的内容呢 private static Iterable<Object> iterable( final Object first, final Object second, final Object[] rest) { checkNotNull(rest); return new AbstractList<Object>()

作者的目的是什么

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

但还是有一点让人困惑,为什么不写下面的内容呢

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];
            }
        }
    };
}
private static Iterable Iterable(最终对象[]rest){
checkNotNull(rest);
返回新的AbstractList(){
@凌驾
公共整数大小(){
返回rest.length;
}
@凌驾
公共对象get(int索引){
返回剩余[索引];
}
};
}

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

使用像这样的签名是一种迫使您至少传入两个参数的技巧——毕竟,如果您没有两个参数,那么就没有什么可以连接

例如:

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

iterable
方法只创建一个
iterable
,而不必将所有内容复制到新数组中。这样做将在参数数量上是
O(n)
;这里采用的方法是
O(1)

令我惊讶的是他们没有打电话。实现几乎相同。@shmosel这可能是因为
Joiner
list
在不同的包中;使用
Joiner
use
Lists
将在包之间引入循环dep,这将阻止您构建一个包而不构建另一个包,这必然会增加二进制大小。是的,这是一种循环依赖关系。
  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.