Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何扩展静态的最终guava实用程序类?_Java_Inheritance_Guava - Fatal编程技术网

Java 如何扩展静态的最终guava实用程序类?

Java 如何扩展静态的最终guava实用程序类?,java,inheritance,guava,Java,Inheritance,Guava,当我使用公共集合时,我对这些UTIL进行了自定义扩展,如: class MyCollectionUtils extends CollectionsUtils { static myutilityMethod() static removeDublicate(..) static myPredicate(...) } 在这种情况下,我拥有CollectionsUtils中的所有功能,我的扩展方法只需一次导入 在guava中,所有静态实用程序类都是final 扩展guava collection

当我使用公共集合时,我对这些UTIL进行了自定义扩展,如:

class MyCollectionUtils extends CollectionsUtils {
static myutilityMethod()
static removeDublicate(..)
static myPredicate(...)
}
在这种情况下,我拥有
CollectionsUtils
中的所有功能,我的扩展方法只需一次导入

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


扩展guava collection API的最佳方法是什么?例如,新的常用谓词、集合工厂等、集合合并器。

由于所有方法都是静态的,因此扩展实用程序类除了能够通过一次导入获取所有内容之外,实际上没有提供任何价值

对我来说,创建自己的实用程序类似乎是最简单的,它不扩展Guava类,只在需要时导入Guava类(使用额外的import语句)。拥有多个导入语句并不坏;使用任何有能力的IDE,您几乎不需要自己管理它们


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

因为所有方法都是静态的,扩展实用程序类除了能够通过一次导入获取所有内容之外,实际上并没有提供任何价值

对我来说,创建自己的实用程序类似乎是最简单的,它不扩展Guava类,只在需要时导入Guava类(使用额外的import语句)。拥有多个导入语句并不坏;使用任何有能力的IDE,您几乎不需要自己管理它们


如果您真的想,您编写的实用程序类可以包装guava方法,但这只会在维护过程中创建更多的方法,因为当guava方法发生变化时,您必须更新您的方法。

我认为您无论如何都不应该在关于静态实用程序的示例中使用继承。扩展类应该保留在实际需要对某种类型的父子关系建模时使用。导入的数量还不足以作为放弃良好样式的理由。

我认为在关于静态实用程序的示例中不应该使用继承。扩展类应该保留在实际需要对某种类型的父子关系建模时使用。导入的数量不足以作为放弃好风格的理由。

原因之一是可读性。读者现在需要了解有关实用程序类的所有信息,即使是对于刚刚转发到Guava的方法

ArrayList<String> myStrings = MySpecialLists.newArrayList();
ArrayList myStrings=MySpecialLists.newArrayList();
这是我用默认值初始化的标准ArrayList还是特殊列表?即使我对番石榴了如指掌,我也不知道答案,直到我检查了你的API。客户机代码不能保证它仍然是简单的Guava版本(也许你会停止从Guava继承,自己实现所有列表方法)。

原因之一是可读性。读者现在需要了解有关实用程序类的所有信息,即使是对于刚刚转发到Guava的方法

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

这是我用默认值初始化的标准ArrayList还是特殊列表?即使我对番石榴了如指掌,我也不知道答案,直到我检查了你的API。客户机代码不能保证它仍然是简单的Guava版本(也许你会停止从Guava继承,自己实现所有列表方法)。

我们设计这些静态实用程序类是为了防止它们被扩展

对于初学者来说,即使静态实用程序类不是final,也不能扩展它们,因为它们不公开构造函数。(您将得到一个编译器错误,无法使用默认构造函数。)


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

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

对于初学者来说,即使静态实用程序类不是final,也不能扩展它们,因为它们不公开构造函数。(您将得到一个编译器错误,无法使用默认构造函数。)


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

我不同意用静态类扩展静态类是个坏主意。例如,在Scala中,用一个对象(单例对象)扩展另一个对象是非常常见的。如果我按照你的方式做的话,我将必须始终执行两个导入“导入静态番石榴。*,导入静态myutils.*”@yura是的,但是导入在Scala中的工作方式不同。在Java中,它非常丑陋。我没有说这是一个“坏主意”,我只是说它没有提供价值。如果API的设计者声明它是最终的,那么他们的意图是不让它扩展(无论出于什么原因)。我想我还是看不出还有几个
import
语句出了什么问题。如果您使用的是IDE,您几乎不需要自己管理它们。@Rob问题是,它将导入和它们背后的内容(guava中的哪些方法和我的扩展中的哪些方法)加倍。通常会有专门针对项目(大项目)的谓词、StringUtils、collectionutils(在我的例子中是优化的推断方法)、一些iterables utils。因此,我必须导入10个UTIL,而不是导入5个UTIL。而且我还必须记住所有的名字,在内存中另外保存20个类更糟糕。扩展一个类是为了继承,这是所有静态方法都不可能做到的。您正试图将其用于聚合,以便只提供一条导入语句。这也很容易出错,比如方法隐藏。此外,当静态方法的用户意识到这是番石榴vs.家庭式解决方案时,他们会更清楚地知道他们在使用什么,并找到合适的文档。静态实用程序类通常被设置为final和/或具有私有构造函数,这两者都会使它们不可扩展