如何创建String类副本?

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

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

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

实现myLength()的最佳方法是什么?

我不是在寻找各种算法来找出字符串的长度,而是重用Stringlength()方法。 现在,一旦我准备好MyString类,我就可以在任何地方使用它来进行自定义操作。

从您的问题来看,您正在寻找的是简单的委托 :

 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 } 

由于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; } } 

通过这里的各种答案,以及askers的更新和说明,似乎提问者想要的是一个外观,气味和听起来像一个字符串的类,但事实并非如此。

那是他们希望能够做到的:

 MyString string = "String!!"; 

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

在弱类型语言中,你可以创建这样一个类,因为如果一个类看起来,闻起来像一个鸭子的声音,那么就所有意图和目的来说,它都是一个鸭子。 然而,Java是一种强类型语言,如果它恰好来自雁鸭科(Anatidae)的鸟类,它只是一只鸭子。

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

这带来了一个重要的问题:为什么你认为你想这样做?

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

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

我不得不假设这是家庭作业。

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

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

http://sofzh.miximages.com/java/repInherWithDel.gif

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

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

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

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