Java中扩展实用类的最佳实践

5
我已经扩展了 apache-commons-3 的类,添加了一些它们中没有的实用函数,例如:

public class CollectionUtils extends org.apache.commons.collections.CollectionUtils
{
        /**
     * Similar to collection.contains(member) except just doesn't throw NPE when set is null, simply returns false
     * @param collection
     * @param member
     * @return
     */
    public static <K> boolean contains(Collection<K> collection,K member)
    {
        return collection!=null && collection.contains(member);
    }
}

这解决了我使用同一类CollectionUtils来调用我的函数和公共函数的目的。
但是,Apache在实用程序类中引入私有构造函数,在版本4中删除了可扩展性。这也有一个相关讨论在这里
现在,如果我升级到版本4,我的代码就会出错。如何最好地扩展实用程序类以添加自定义/特定实用方法?
1个回答

6
虽然我投票将其标记为“基于观点”,但我想给你一些建议。
正如在你链接的讨论中已经提到的,扩展实用类本身就是一种不良实践。版本4的变化可能旨在规范这一做法。
扩展实用类(仅使用静态方法)没有意义,因为你无法覆盖静态方法。但是,你可以隐藏它们。这意味着可能会意外发生未预期的行为,存在风险,且没有真正的价值。如果你只使用两个实用类,它不会让你的代码更加复杂。甚至还有一个编译器警告,提示你不要直接访问静态方法。
引用:
增加自定义/特定实用方法扩展实用类的最佳做法是总结:最好的做法是不要扩展它们,而是使用第二个自定义实用类。

1
Re: “如果您只是使用两个实用程序类,这确实不会使您的代码更复杂。”:2比1更复杂。现在你需要在两个地方搜索该方法。代码自动完成功能变得不太有用。在可能的情况下,您还可以将库别名为某些简短的名称(例如:StringU、StrU或甚至SU),只要那些工作于代码的人能够理解它即可。 (静态导入可以缓解此问题,但也可能会导致更多混淆,因为那么就没有类名称)。你可以委托,但那需要更多的维护。另外:通常,您不想重写,只是添加。 - mconner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接