我只是看着番石榴ImmutableList
,发现该of()
方法被重载了12次。
在我看来,他们所需要的只是:
static <E> ImmutableList<E> of();
static <E> ImmutableList<E> of(E element); // not even necessary
static <E> ImmutableList<E> of(E... elements);
有这么多类似变体的原因是什么?
Varargs和泛型不能很好地配合使用。Varargs方法可能会引发带有通用参数的警告,并且重载会阻止该警告,除非在极少数情况下,您想使用来向不可变列表中添加11个以上的项of()
。
资料中的评论说:
这些多达十一。在那之后,您仅获得varargs表单,并且可能伴随任何警告。:(
请注意,专门添加了Java
7的@SafeVarargs批注,以消除此类需求。可以使用of(E...)
带有注释的单个方法,@SafeVarargs
并且不会通过通用参数给出警告。
问题内容: 我想知道哪个更有效,为什么? 1) 要么 2) 问题答案: 我看不出您为什么要在此处使用builder的任何原因: 比在这种情况下制作一个更具可读性, 不会推断通用类型,并且在用作单行代码时必须自己指定类型, (来自docs) 在与另一个不可变集合调用时 做得很好( 尝试避免在安全的情况下实际复制数据 ), (从源) 调用以前创建的,同时避免为零元素和一元素集合创建任何列表(分别返回空
我对番石榴很陌生(说实话,我不是“很新”,我是这个主题的新手),所以我决定浏览一些文档,在阅读本文时感到非常惊讶: 我不明白这个方法的意义。这意味着,与其这样做,不如: (如果myObject为null,这可能会导致) 我应该用 如果为空,这将抛出一个,如果它不是空,则返回。 我很困惑,这可能是有史以来最愚蠢的问题,但是... 这有什么意义?这两条线和我能想到的任何情况下的结果是完全一样的。 我甚
问题内容: 有没有理由 但不是 ? 如何正确过滤列表?我可以用 当然可以,但是如果我理解正确的话,就不能保证我的订购顺序保持不变。 问题答案: 它之所以未实现,是因为它会在返回的List视图上暴露大量危险的慢速方法,例如#get(index)(会引发性能错误)。ListIterator也很难实现(尽管我几年前提交了一个补丁来解决)。 由于索引方法在过滤后的列表视图中效率不高,因此最好使用不包含它们
问题内容: 我是番石榴的新手(老实说,我不是“新手”,我是这个主题的新手),所以我决定阅读一些文档,并在阅读本文时感到非常惊讶: 我不明白这种方法的意义。这意味着不要这样做: (如果myObject为null ,则可能会导致) 我应该用 这 将 抛出如果是空和返回,如果它不为空。 我很困惑,这可能是有史以来最愚蠢的问题,但是… 这有什么意义呢?在我能想到的任何情况下,这两行所做的事情与结果完全一样
问题内容: 在遍历该 方法时,我看到了方法的多个重载实现: 然后另一个重载方法 当此varargs可以处理其他实现时,为什么以这种方式重载此方法?有什么具体原因吗? 我已经阅读过相同的Javadoc,但是找不到任何令人信服的解释。 问题答案: Varargs方法创建一个数组。 这是有效的,因为创建了隐式数组。是一个设计得非常快的类,因此通过创建所有额外的重载,它们可以在前几种情况下 跳过数组创建步
问题内容: 从Effective Java Second Edition的第28项开始:“不要将通配符类型用作返回类型。与其为用户提供额外的灵活性,不如将其强制在客户端代码中使用通配符类型。” 我刚开始接触通用通配符,以了解我在编写的一段代码中最后一次未经检查的强制转换警告,而且我不明白为什么getRawType()返回通配符类型。 我必须转换token.getRawType()因为它返回一个 问