为内置类型添加功能的最佳方法

tyr*_*dis 5 java oop

我想知道在严格的OOP方面,为字符串或整数或更复杂的对象(在我的例子中是BitSet类)添加内置类型的功能的最佳方法是什么.

更具体一点 - 我有两个场景:

  1. 将一个md5哈希方法添加到String对象
  2. 将转换方法(如fromByteArray()或toInteger())添加到BitSet类.

现在我想知道实现这个的最佳实践是什么.

我可以创建一个从BitSet扩展的新类"BitSetEx"并添加我的方法.但我不喜欢这个想法,因为这个新类需要描述名称和"BitSetWithConversionMethods"听起来真的很傻.

现在我可以编写一个只包含执行转换的静态方法的类.

我有很多想法,但我不知道OOP意义上的"最佳".

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

Cow*_*wan 3

这里有几种方法:

首先,你可以为班级起一个更好的名称extends BitSet。不,BitsetWithConversionMethods这不是一个好名字,但也许ConvertibleBitSet是这样的。这是否传达了该类的意图和用法?如果是的话,这是一个好名字。同样,您可能有 a HashableString(请记住,您不能扩展String,正如安东尼在另一个答案中指出的那样)。XableY这种用(or XingY, likeBufferingPort或)命名子类的方法SigningEmailSender有时对于描述新行为的添加很有用。

也就是说,我认为你的问题(无法找到名字)有一个公平的暗示,这可能不是一个好的设计决策,而且它试图做太多事情。一个类应该“做一件事”,这通常是一个很好的设计原则。显然,根据抽象级别,可以扩展到包括任何内容,但值得考虑:“操作多个位的设置/取消设置状态”和“将位模式转换为另一种格式”算作一个事物?我认为(特别是暗示你很难想出一个名字)它们可能是两种不同的职责。如果是这样,拥有两个类最终会更干净,更容易维护(另一条规则是“一个类应该有一个改变的理由”;一个同时进行操作和转换的类至少有两个改变的理由),更容易测试隔离等

因此,在不了解您的设计的情况下,我建议可能有两个课程;在这个BitSet例子中,有 aBitSet和(比如说)aBitSetConverter负责转换。如果你想变得非常奇特,甚至可能:

interface BitSetConverter<T> {
 T convert(BitSet in);
 BitSet parse(T in);
}
Run Code Online (Sandbox Code Playgroud)

那么你可能有:

BitSetConverter<Integer> intConverter = ...;
Integer i = intConverter.convert(myBitSet);
BitSet new = intConverter.parse(12345);
Run Code Online (Sandbox Code Playgroud)

这确实隔离了您的更改,使每个不同的转换器都可以测试,等等。

(当然,一旦你这样做了,你可能想看看guava并考虑使用Function,例如 aFunction<BitSet, Integer>对于一种情况,对于Function<Integer, BitSet>另一种情况。然后你获得了一个Function可能有用的支持代码的整个生态系统)