我不知道从严格的OOP角度来看,向诸如字符串,整数或更复杂的对象(在我的情况下为BitSet类)的内置类型中添加功能的最佳方法是什么?

更具体地说-我有两种情况:

  • 向String对象
  • 添加md5哈希方法
  • 将转换方法(例如fromByteArray()或toInteger())添加到BitSet类。

  • 现在,我想知道实现此目标的最佳做法是什么。

    我可以例如创建一个从BitSet扩展的新类“BitSetEx”,并添加我的方法。但是我不喜欢这个主意,因为这个新类需要描述名称,而“BitSetWithConversionMethods”听起来真的很愚蠢。

    现在,我可以编写一个仅包含静态方法进行转换的类。

    好吧,我有很多想法,但是我不知道什么是OOP方面的“最佳”。

    那么有人可以回答我这个问题吗?

    最佳答案

    这里有几种方法:

    首先,您可以为extends BitSet类想出一个更好的名称。不,BitsetWithConversionMethods不是一个好名字,但也许像ConvertibleBitSet这样的东西是不错的。这是否传达了类(class)的意图和用法?如果是这样,这是一个好名字。同样,您可能有一个HashableString(请记住,您不能扩展String,正如Anthony在另一个答案中指出的那样)。这种用XableY(或XingY,例如BufferingPortSigningEmailSender)命名子类的方法有时可能是描述添加新行为的有用方法。

    就是说,我认为您的问题中有一个明确的提示(无法找到名称),这也许不是一个好的设计决定,它正在尝试做很多事情。通常,一个类应该“做一件事”是一个很好的设计原则。显然,取决于抽象级别,可以将其扩展为包括任何内容,但是值得考虑:将“操纵多个位的设置/未设置状态”和“将位模式转换为另一种格式”算作一个事物?我认为(尤其是暗示您很难想出一个名字),他们可能是两个不同的职责。如果是这样,拥有两个类最终将变得更整洁,更易于维护(另一条规则是“一个类应该有一个改变的理由”;同时操作和转换的一个类至少有两个改变的理由),更易于测试孤立地等

    因此,在不了解您的设计的情况下,我建议您安排两个类;在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/

    10-12 20:49