用Java装饰字符串

用Java装饰字符串,java,decorator,Java,Decorator,假设我想使用Decorator模式向java.lang.String类添加功能。(例如,添加toRussian()方法。)String是最后一个类。以下是唯一的方法吗 class DecoratedString implements Serializable, CharSequence, Comparable<DecoratedString> { private final String str; public DecoratedString (String st

假设我想使用Decorator模式向java.lang.String类添加功能。(例如,添加toRussian()方法。)String是最后一个类。以下是唯一的方法吗

class DecoratedString implements Serializable, CharSequence, 
    Comparable<DecoratedString> 
{
  private final String str;
  public DecoratedString (String str) {
    this.str = str;
  }
  public DecoratedString toRussian() {
     ...
  }
  public String toString() { return str; }
  public int hashCode() { return str.hashCode(); }
  public boolean equals(Object obj) { /* don't forget this one */ } 
  public char charAt(int index) { return str.charAt(index);}
  public int codePointAt(int index) { return str.codePointAt(index);}
  ... and so on for 30 or so more methods of String ...
}
附言:在Objective-C中使用“类别”很容易做到这一点。Python现在有@Decorators。当然,这在JavaScript中是很平常的,在JavaScript中,您通常会将trim()添加到字符串原型中。在Java中完全不可能吗


Postpostscript:好的,toRussian()是一个糟糕的例子。如果字符串还没有trim(),您将如何添加trim()?trim()是每个字符串都应该具有的一个示例。

我需要一个转换器接口,并将一个(不可变的)字符串传递给它。不同语言的不同实现

为什么要将所有特定于俄语的逻辑嵌入到修饰字符串中?

通常通过使用附加功能扩展原始类来实现

因为
字符串
类是final,所以不能扩展它

使用组合而不是继承的缺点是,装饰器的实现方式通常是在任何可以使用X的地方都可以使用装饰X。(该模式实际上应该允许您使用任意数量的装饰器装饰X,并且仍然将其用作X。)您当前的设计将无法做到这一点,并且最终将重新实现所需的任何扩展字符串功能


一种不同的设计模式可能是合适的。

这种翻译不是Java背后的全部要点吗?

因为
DecoratedString
绝对不会与需要
字符串的代码类型兼容,这有什么意义呢?我同意Kirk,让转换器独立于字符串对象将更有意义。换句话说,在Java中,您不能修饰最后一个类。您可以为非final类创建子类,或者扩展接口,并为要修饰的对象创建包装器。这就是在Java中使用装饰器模式的限制吗?我会使用trim(),与在JavaScript中向字符串原型添加trim()并行,但是每个人都会说“字符串已经有trim()!”好的,好的,toRussian()是一个坏例子!我明白了!在JavaScript中,我可以将trim()添加到字符串原型中,然后在任何我想要的地方,我都可以说var trim=inputString.trim()。或var translated=inputString.trim().toUpper().toRussian().prettyPrint()或其他。在Java中,我只能执行类似以下操作:String processed=new PrettyPrinter().prettyPrint(new RussianTranslator().translate(inputString.toUpper().trim())?您可以使用静态方法来避免某些实例化,但通过设计,您无法像在其他语言中那样更改基本字符串类。许多其他OO语言(如.NET)提供了修改核心类(如字符串)的机制,有人认为Java没有提供类似的机制是一个弱点。
String greeting = new DecoratedString("Hello, world!").toRussian().toString();