如何扩展静态最终番石榴实用程序类?

时间:2011-07-06 16:01:54

标签: java inheritance guava

当我使用common-collections时,我已对这些工具进行了自定义扩展,例如:

class MyCollectionUtils extends CollectionsUtils {
static myutilityMethod()
static removeDublicate(..)
static myPredicate(...)
}

在这种情况下,我拥有CollectionsUtils和我的扩展方法的所有功能,只有一个导入!

在guava中,所有静态实用程序类都是final

扩展番石榴收集API的最佳方法是什么?例如,新的常用谓词,集合工厂等,集合组合器。

4 个答案:

答案 0 :(得分:6)

对于一个为什么回答,可读性。读者现在需要了解您的实用程序类的所有内容,即使对于只转发给Guava的方法也是如此。

ArrayList<String> myStrings = MySpecialLists.newArrayList();

这是一个标准的ArrayList还是我用默认值初始化的特殊列表?即使我内外都知道番石榴,在我检查你的API之前我也不知道答案。并且客户端代码不能保证它将保持简单的Guava版本(也许你将停止从Guava继承,并且只是自己实现所有列表方法)。

答案 1 :(得分:3)

由于所有方法都是静态的,因此扩展实用程序类并不能提供除了通过一次导入获取所有内容的能力之外的任何其他值。

对我来说,创建自己的实用程序类似乎最简单,它不会扩展Guava,只需在需要时导入guava(使用额外的import语句)。有多个import语句也不错;使用任何称职的IDE,你甚至不必自己管理它们。

如果你真的想要,你编写的实用程序类可以包装guava方法,但这只会在维护方式上创建更多,因为当番石榴更改时你必须更新你的方法

答案 2 :(得分:2)

我们专门设计了这些静态实用程序类,以防止它们被扩展。

对于初学者来说,即使它们不是最终的,也无法扩展静态实用程序类,因为它们不会暴露构造函数。 (您将收到编译器错误,无法使用默认构造函数。)

进口很便宜。继续使用两个。

答案 3 :(得分:1)

我认为你不应该在你的示例中使用继承关于静态实用程序。当您确实需要为某种类型的父子关系建模时,应保留扩展类。进口的数量不足以放弃好的风格。