3

问题:

我想扩展 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[]) 方法设置了一些 BitSet 的私有变量,我无法通过 MyBitSet 子类访问这些变量,因此我看不到任何直接复制超类实现的简单方法 - 不好解决方案,但我只是在这里考虑我的选择。

问题:

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

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

有什么我可能忽略的吗?

我宁愿避免的解决方案:

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

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

深思熟虑类型的问题:

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

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

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

4

1 回答 1

1

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

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

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

有什么我可能忽略的吗?

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

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

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

于 2020-05-09T13:03:56.833 回答