我可以使用超类的类工厂静态方法创建子类实例吗?

Can I Create a Subclass Instance Utilising a Factory-like Static Method of the Superclass?

问题:

我想扩展 Java 的 java.util.BitSet,使用我自己的 MyBitSet,只是添加一些我经常使用的functionality/transformation方法。

我发现在我的代码中真正有用的 BitSet 方法是 "factory-like" public 静态方法 BitSet.valueOf(long[]) ,所以我希望我的 MyBitSet class 提供从提供的 long[].

创建 MyBitSet 实例的相同实用程序

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

和 BitSet.valueOf(long[]) returns 一个新的 BitSet 对象,所以由于 ClassCastException,我不能将它强制转换为我的 MyBitSet subclass。

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

问题:

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

一般来说,是否可以利用 "factory-like" 静态方法,如 valueOf(long[]),来创建我自己的 subclass 实例?

有什么我可能忽略的吗?

我宁愿避免的解决方案:

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

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

深思题型:

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

难道不提供这样的 public 构造函数,而只提供 "factory-like" 静态方法,这实际上是一种预期的模式,以防止开发人员使用它来初始化自己的子class 实例处于非默认状态?

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

Can I somehow provide such a functionality in my MyBitSet subclass?

In general, is it possible to utilise "factory-like" static methods, like valueOf(long[]), to create an instance of my own subclass?

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

Is there anything I might have overlooked?

你说包装器 class 感觉有点奇怪。我不知道那是什么意思,但你可能听说过,Prefer composition over inheritance

a "factory-like" static method instead, is actually an intended pattern

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