【问题标题】:Why does guava joiner implement a private method iterable(final Object first, final Object second, final Object[] rest)?为什么 guava joiner 实现了一个私有方法 iterable(final Object first, final Object second, final Object[] rest)?
【发布时间】:2018-06-27 19:38:54
【问题描述】:
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];
        }
    };
}

【问题讨论】:

    标签: java guava iterable joiner


    【解决方案1】:

    这里的重点是这个方法是从公共方法调用的,看起来像 (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)

    【讨论】:

    • 令我惊讶的是他们没有打电话给Lists.asList()。实现几乎相同。
    • @shmosel 可能是因为 JoinerLists 位于不同的包中;让 Joiner 使用 Lists 会在包之间引入循环 dep,这将阻止您构建一个而没有另一个,必然会增加二进制大小。
    • 是的,这是一个循环依赖的东西。
    猜你喜欢
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2015-01-20
    • 2017-07-07
    • 2011-09-18
    • 2016-06-16
    相关资源
    最近更新 更多