我不知道从严格的OOP角度来看,向诸如字符串,整数或更复杂的对象(在我的情况下为BitSet类)的内置类型中添加功能的最佳方法是什么?
更具体地说-我有两种情况:
现在,我想知道实现此目标的最佳做法是什么。
我可以例如创建一个从BitSet扩展的新类“BitSetEx”,并添加我的方法。但是我不喜欢这个主意,因为这个新类需要描述名称,而“BitSetWithConversionMethods”听起来真的很愚蠢。
现在,我可以编写一个仅包含静态方法进行转换的类。
好吧,我有很多想法,但是我不知道什么是OOP方面的“最佳”。
那么有人可以回答我这个问题吗?
最佳答案
这里有几种方法:
首先,您可以为extends BitSet
类想出一个更好的名称。不,BitsetWithConversionMethods
不是一个好名字,但也许像ConvertibleBitSet
这样的东西是不错的。这是否传达了类(class)的意图和用法?如果是这样,这是一个好名字。同样,您可能有一个HashableString
(请记住,您不能扩展String
,正如Anthony在另一个答案中指出的那样)。这种用XableY
(或XingY
,例如BufferingPort
或SigningEmailSender
)命名子类的方法有时可能是描述添加新行为的有用方法。
就是说,我认为您的问题中有一个明确的提示(无法找到名称),这也许不是一个好的设计决定,它正在尝试做很多事情。通常,一个类应该“做一件事”是一个很好的设计原则。显然,取决于抽象级别,可以将其扩展为包括任何内容,但是值得考虑:将“操纵多个位的设置/未设置状态”和“将位模式转换为另一种格式”算作一个事物?我认为(尤其是暗示您很难想出一个名字),他们可能是两个不同的职责。如果是这样,拥有两个类最终将变得更整洁,更易于维护(另一条规则是“一个类应该有一个改变的理由”;同时操作和转换的一个类至少有两个改变的理由),更易于测试孤立地等
因此,在不了解您的设计的情况下,我建议您安排两个类;在BitSet
示例中,同时具有BitSet
和(例如)负责转换的BitSetConverter
。如果您真的想花哨的话,甚至可以:
interface BitSetConverter<T> {
T convert(BitSet in);
BitSet parse(T in);
}
那么您可能有:
BitSetConverter<Integer> intConverter = ...;
Integer i = intConverter.convert(myBitSet);
BitSet new = intConverter.parse(12345);
真正隔离您的更改,使每个不同的转换器都可测试,等等。
(当然,一旦这样做,您可能希望查看guava并考虑使用Function,例如,一种情况下使用
Function<BitSet, Integer>
,另一种情况下使用Function<Integer, BitSet>
。然后您将获得一个完整的Function
支持代码生态系统,这可能会很有用)关于java - 向内置类型添加功能的最佳方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6009020/