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]; } } }; }
作者的目的是什么 我猜他想利用编译器生成的数组,而不是新的ArrayList 但还是有一点让人困惑,为什么不写下面的内容呢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>()
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
useLists
将在包之间引入循环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.