问题:
我想扩展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实例的方法。
难道没有提供这样的公共构造函数,而是仅提供“类似于工厂”的静态方法实际上是一种预期的模式,以防止开发人员在默认状态以外的其他状态下使用它来初始化自己的子类实例吗?
如果是这样,为什么?在这种情况下会是什么问题?
我可以在MyBitSet子类中提供某种功能吗?
通常,是否可以利用像valueOf(long [])这样的“类工厂”静态方法来创建我自己的子类的实例?
您当然可以在子类中添加一个新的静态工厂方法。但它不会从父类继承任何方法。客户将必须找到您的新静态方法并知道要调用它。
有什么我可能会忽略的吗?
你说包装课有点奇怪。我不知道这是什么意思,但您可能已经听说过,更喜欢组合而不是继承。
相反,“类似于工厂”的静态方法实际上是预期的模式
是的,静态工厂方法无疑是预期的模式。标签Wiki中列出了它的优缺点。模式的实现方式可以相当灵活,也可以完全不灵活。如果作者想使用它来强制执行特定的默认值,那就是一个不灵活的用例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句