2011-07-06 13 views
1

当我用普通的集合我已经做了自定义扩展到那些像utils的:如何扩展一个静态的最终番石榴公用事业课程?

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

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

在番石榴中,所有的静态工具类都是final

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

回答

6

对于一个为什么答案,可读性。读者现在需要知道所有关于您的实用课程,即使只是转发到番石榴的方法。

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

这是一个标准的ArrayList或特殊的列表我已经用默认值初始化了吗?即使我内外都知道番石榴,但直到我检查了API之后,我才知道答案。客户端代码不能保证它仍然是简单的Guava版本(也许你会停止从Guava继承,而只是自己实现所有的列表方法)。

3

由于所有的方法都是静态的,所以扩展实用类并不真正提供任何值,只能通过一次导入来获取所有内容。

对我来说,创建自己的实用程序类并不会扩展Guava,而只是在需要时导入番石榴(带有额外的导入语句)似乎是最简单的。拥有多个导入语句并不错;与任何主管的IDE你甚至不必自己管理它们。

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

+0

我不同意用静态类扩展静态类是个坏主意。例如在Scala中,将一个对象(单例)与另一个对象进行扩展是很常见的。 如果我这样做,我将不得不始终做两个进口“导入静态番石榴。*,导入静态myutils。” – yura

+2

@yura是的,但进口工作在Scala中的工作方式不同。在Java中,它只是简单的丑陋。 –

+0

我没有说这是一个“坏主意”,我只是说它不提供价值。如果API的设计者宣布它是“最终”的,那么他们的意图是不要延长(无论出于何种原因)。我想我还是没有看到更多'import'语句有什么问题。如果您使用IDE,则几乎不需要自己管理它们。 –

1

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

2

我们专门设计了这些静态工具类,以防止它们被扩展。

对于初学者来说,即使它们不是最终的,也不能扩展静态工具类,因为它们不公开构造函数。 (你会得到一个编译器错误,说明默认的构造函数无法使用。)

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