gpt4 book ai didi

java - 为什么 guava joiner 实现一个私有(private)方法 iterable(final Objectfirst,finalObject第二,finalObject[]rest)?

转载 作者:行者123 更新时间:2023-11-30 02:16:13 28 4
gpt4 key购买 nike

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];
}
};
}

最佳答案

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

关于java - 为什么 guava joiner 实现一个私有(private)方法 iterable(final Objectfirst,finalObject第二,finalObject[]rest)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48326260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com