【发布时间】: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