Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向内置类型添加功能的最佳方法_Java_Oop - Fatal编程技术网

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

Java 向内置类型添加功能的最佳方法,java,oop,Java,Oop,我想知道在严格的OOP中,向内置类型(如字符串、整数或更复杂的对象(在我的例子中是BitSet类))添加功能的最佳方式是什么 更具体地说,我有两种情况: 向String对象添加md5哈希方法 向位集类添加转换方法(如fromByteArray()或toInteger()) 现在我想知道实现这一点的最佳实践是什么 例如,我可以创建一个从BitSet扩展的新类“BitSetEx”,并添加我的方法。但是我不喜欢这个想法,因为这个新类需要描述名称和“BitSetWithConversionMethods

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

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

  • 向String对象添加md5哈希方法
  • 向位集类添加转换方法(如fromByteArray()或toInteger())
  • 现在我想知道实现这一点的最佳实践是什么

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

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

    我有很多想法,但我不知道什么是OOP意义上的“最佳”


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

    我会选择扩展类。这实际上就是您正在做的,用一些额外的方法扩展当前类

    至于名称:您不应该为新功能命名,因为您以后可能会添加更多。这是您的扩展位集类,因此
    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);
    
    这将真正隔离您的更改,使每个不同的转换器都可测试,等等

    (当然,一旦你这样做了,你可能会考虑使用一个例子,比如一个<代码>函数>代码>一个例子,另一个代码<>代码>另一个,然后得到一个完整的生态系统<代码>函数< /> >支持代码,这可能是有用的)