Java 向内置类型添加功能的最佳方法
我想知道在严格的OOP中,向内置类型(如字符串、整数或更复杂的对象(在我的例子中是BitSet类))添加功能的最佳方式是什么 更具体地说,我有两种情况:Java 向内置类型添加功能的最佳方法,java,oop,Java,Oop,我想知道在严格的OOP中,向内置类型(如字符串、整数或更复杂的对象(在我的例子中是BitSet类))添加功能的最佳方式是什么 更具体地说,我有两种情况: 向String对象添加md5哈希方法 向位集类添加转换方法(如fromByteArray()或toInteger()) 现在我想知道实现这一点的最佳实践是什么 例如,我可以创建一个从BitSet扩展的新类“BitSetEx”,并添加我的方法。但是我不喜欢这个想法,因为这个新类需要描述名称和“BitSetWithConversionMethods
有人能回答我这个问题吗?我会选择扩展类。这实际上就是您正在做的,用一些额外的方法扩展当前类 至于名称:您不应该为新功能命名,因为您以后可能会添加更多。这是您的扩展位集类,因此
BitSetEx
allready听起来比您建议的BitSetWithConversionMethods
更好
您不希望使用静态方法编写类,这就像OOP环境中的过程编程一样,被认为是错误的。您有一个具有特定方法的对象(如要生成的
fromByteArray()
),因此您希望这些方法位于该类中。扩展是一条路。视情况而定。正如nanne指出的,子类是一种选择。但只是有时候。字符串声明为final,因此不能创建子类。您至少有两个其他选项:
1) 使用“封装”,即创建一个类MyString,它有一个操作字符串(与扩展字符串相反,扩展字符串是不能做的)。基本上是一个围绕字符串的包装器,用于添加您的功能
2) 创建一个实用程序/帮助程序,即只包含对字符串进行操作的静态方法的类。大概是
class OurStringUtil {
....
public static int getMd5Hash(String string) {...}
....
}
看看这些东西,它遵循这个方法;太棒了。“最佳方式”有点主观。请记住,String是最后一个类,所以不能扩展它。
两种可能的方法是使用额外的方法编写包装器,例如
StringWrapper(String)
,或者某种类型的StringUtils
类充满静态方法(因为Java 5,如果不想直接使用util类,可以导入静态方法) 这里有几种方法:
首先,您可以为扩展位集
类提供更好的名称。不,BitsetWithConversionMethods
不是一个好名字,但可能类似于ConvertibleBitSet
的东西是。这是否传达了该类的意图和用法?如果是的话,这是个好名字。同样,您可能有一个HashableString
(请记住,正如Anthony在另一个回答中指出的,您不能扩展String
)。这种使用XableY
(或XingY
,如BufferingPort
或SigningEmailSender
)命名子类的方法有时可以用来描述新行为的添加
也就是说,我认为在你的问题中有一个合理的暗示(找不到一个名字),也许这不是一个好的设计决策,它试图做的太多了。一个类应该“做一件事”,这通常是一个好的设计原则。显然,根据抽象级别的不同,这可以扩展到包括任何内容,但值得考虑的是:“操纵若干位的设置/取消设置状态”和“将位模式转换为另一种格式”是否算作一件事?我认为(特别是在暗示你很难想出一个名字的情况下),它们可能是两种不同的责任。如果是这样的话,拥有两个类将变得更干净、更易于维护(另一条规则是“一个类应该有一个更改的原因”;一个同时进行操纵和转换的类至少有两个更改的原因),更易于单独测试,等等
因此,在不了解您的设计的情况下,我建议可能有两个类;在位集
示例中,既有位集
又有(比如)负责转换的位集转换器
。如果你真的想变得花哨,甚至可能:
interface BitSetConverter<T> {
T convert(BitSet in);
BitSet parse(T in);
}
接口位设置转换器{
T转换(在中设置位);
位集解析(T-in);
}
那么你可能会:
BitSetConverter<Integer> intConverter = ...;
Integer i = intConverter.convert(myBitSet);
BitSet new = intConverter.parse(12345);
BitSetConverter intConverter=。。。;
整数i=intConverter.convert(myBitSet);
BitSet new=intConverter.parse(12345);
这将真正隔离您的更改,使每个不同的转换器都可测试,等等
(当然,一旦你这样做了,你可能会考虑使用一个例子,比如一个<代码>函数>代码>一个例子,另一个代码<>代码>另一个,然后得到一个完整的生态系统<代码>函数< /> >支持代码,这可能是有用的)