为什么guava joiner实现了一个私有方法iterable(final Object first, final Object second, final Object[] rest)?
Why does guava joiner implement a private method iterable(final Object first, final Object second, final Object[] rest)?
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)
.
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)
.