如何创建String类副本?

时间:2010-01-15 00:22:44

标签: java string

我需要使用与java.lang.String完全相同的方法创建一个类。

在Java中执行此操作的最佳方法是什么?

我知道我不能扩展String类,因为它是final。我不是在寻找需要复制java.lang.String源代码的解决方案。例如,假设我在名为length()的自定义类中需要功能MyString,该类具有相应的'myLength()`方法。

实施myLength()的最佳方式是什么?

我没有查看各种算法来查找字符串的长度,而是重用String的{​​{1}}方法。现在,一旦我准备好length()课程,我就可以在任何地方使用它进行自定义操作。

8 个答案:

答案 0 :(得分:10)

通过这里的各种答案,以及askers的更新和澄清,似乎提问者想要的是一个外观,气味和听起来像一个字符串的类,但不是。

他们希望能够做到:

MyString string = "String!!";

这不起作用,因为java.lang.String是最终类,因此编译器生成的每个"String"都是java.lang.String个对象,因为这不是MyString对象不能彼此分配。

在弱类型语言中,你可以创建这样一个类,因为如果一个类看起来像是duck那样气味和听起来,那么对于所有意图和目的来说,它都是一个鸭子。然而,Java是一种强类型语言,如果碰巧来自Anatidae family of birds,那么它只是一只鸭子。

答案 1 :(得分:8)

由于final类无法进行子类化,因此请创建一个新类在其中包含 String实例并对此对象进行操作。

public class MyString {
  private String s;

  public MyString( String s ) {
    setInternalString( s );
  }

  public int myLength() {
    return getInternalString().length();
  }

  private void setInternalString( String s ) {
    this.s = s;
  }

  private String getInternalString() {
    return this.s == null ? "" : this.s;
  }
}

答案 2 :(得分:5)

从您的问题来看,您所寻找的事情很简单delegation

class MyString {

  String delegate; // The actual string you delegate to from your class

  public MyString(String delegate) {
    this.delegate = delegate; // Assign the string that backs your class
  }

  int length() {
    return delegate.length(); // Delegate the method call to the string
  }

  // other methods that delegate to the string field
}

答案 3 :(得分:3)

我认为你的意思是java.lang.String。但是,您无法将String替换为您自己的类。您可以使用相同的方法创建另一个类(通过复制源代码并更改包声明),但是您将无法将该类的实例传递给需要String的方法。

这提出了一个重要问题:为什么你认为你想这样做?

答案 4 :(得分:3)

我想是

Proxy设计模式。这是一个愚蠢的问题(不是对提问者的反思,而是对在求职面试中问他的人)。可能是那个问你的人没有意识到String是最终的?否则我想不出他们为什么会问。

答案 5 :(得分:2)

创建一个新类(当然,它需要一个不同的包,实现相同的接口并添加String类中的所有公共方法(读取javadoc以确保获得所有内容)。

我必须假设这是作业。

答案 6 :(得分:1)

您可以使用重构:Replace inheritance with delegation,它基本上(如前面的答案中所示)创建所需类型的实例变量,并在新类中实现其所有方法并将消息传递给它们。

  

为超类创建一个字段,调整方法以委托给超类,并删除子类。

https://www.refactoring.com/catalog/repInherWithDel.gif

你会注意到这是一个很好的打字,这是一个好的IDE来的方便。

以下视频显示了IntelliJ IDEA 9如何做到这一点。

http://img43.imageshack.us/img43/5647/capturadepantalla201001k.png

答案 7 :(得分:0)

如果您只想覆盖String行为的一部分,可以尝试使用动态代理。在API中查找java.lang.reflect.Proxy

相关问题