【问题标题】:Can I Create a Subclass Instance Utilising a Factory-like Static Method of the Superclass?我可以使用超类的类工厂静态方法创建子类实例吗?
【发布时间】:2020-04-29 17:48:18
【问题描述】:

问题:

我想扩展Java的java.util.BitSet,使用我自己的MyBitSet,只是为了添加一些我经常使用的功能/转换方法。

我发现在我的代码中真正有用的 BitSet 方法是“工厂式”公共静态方法 BitSet.valueOf(long[]),所以我希望 MyBitSet 类提供相同的方法从提供的 long[] 创建 MyBitSet 实例的实用程序。

问题是 Java 的 BitSet 没有提供接受 long[] 参数的公共构造函数,所以我不能只使用 super()。

并且 BitSet.valueOf(long[]) 返回一个新的 BitSet 对象,因此由于 ClassCastException,我不能将其转换为 MyBitSet 子类。

此外,BitSet.valueOf(long[]) 方法设置了一些我无法通过 MyBitSet 子类访问的 BitSet 私有变量,因此我看不到任何直接复制超类实现的简单方法- 一个糟糕的解决方案,但我只是在这里考虑我的选择。

问题:

我可以在 MyBitSet 子类中以某种方式提供这样的功能吗?

一般来说,是否可以利用“类工厂”静态方法,如 valueOf(long[]),来创建我自己的子类的实例?

有什么我可能忽略的吗?

我宁愿避免的解决方案:

另一种解决方案是使用 BitSet 的包装类而不是扩展它。

也就是说,一个将 BitSet 实例作为变量保存并应用我在该 BitSet 变量中需要的附加功能的类。
但是这种方法现在感觉有点奇怪,如果可能的话,我宁愿扩展 BitSet。

发人深省的问题:

BitSet.valueOf(long[]) 是一种在特定的初始化状态而不是默认状态下创建新 BitSet 实例的方法

难道不提供这样的公共构造函数,而只提供一个“类工厂”的静态方法,实际上是一种预期的模式,以防止开发人员使用它来初始化他们自己的子类实例,而不是默认?

如果是这样,为什么?在这种情况下会出现什么问题?

【问题讨论】:

    标签: java inheritance static-factory


    【解决方案1】:

    我可以在 MyBitSet 子类中以某种方式提供这样的功能吗?

    一般来说,是否可以利用“类工厂”静态方法,如 valueOf(long[]),来创建我自己的子类的实例?

    你当然可以在你的子类中添加一个新的静态工厂方法;但它不会从父类继承任何方法。客户必须找到您的新静态方法并知道要调用它。

    有什么我可能忽略的吗?

    你说包装类感觉有点怪。我不知道这意味着什么,但你可能听说过,Prefer composition over inheritance

    一个“类似工厂”的静态方法,实际上是一种预期的模式

    是的,Static Factory Method 肯定是一个预期的模式。标签 wiki 中列出了它的优缺点。该模式可以相当灵活或完全不灵活,具体取决于它是如何实现的。如果作者想用它来强制执行特定的默认值,那是一个不灵活的用例。

    【讨论】:

    • 感谢您的回复,非常感谢。因此,如果我理解正确,我将不得不从头开始实现我自己的静态工厂方法,而不能部分地使用预先存在的 .valueOf(long[])。另外,说包装类感觉有点怪,我的意思是我想公开 BitSet 类的完整接口以及我添加的功能,因此继承似乎更合适。
    • 您自己的 SFM 可以调用原始 SFM,然后修改结果或将其包装在装饰器之类的东西中。但这并不能阻止对原始 SFM 的调用绕过您的新逻辑。
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 2019-04-15
    • 2021-05-14
    • 2015-04-16
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多