Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String - Fatal编程技术网

Java 如何创建字符串类副本?

Java 如何创建字符串类副本?,java,string,Java,String,我需要使用与java.lang.String完全相同的方法创建一个类 在Java中实现这一点的最佳方法是什么 我知道我不能扩展String类,因为它是final。我不是在寻找需要复制java.lang.String源代码的解决方案。例如,假设我需要名为MyString的自定义类中的功能length(),该类具有相应的“myLength()”方法 实现myLength()的最佳方法是什么 我不是在研究各种算法来找出字符串的长度,而是要重用string的length()方法。现在,一旦我准备好了My

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

在Java中实现这一点的最佳方法是什么

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

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

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

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


我必须假设这是家庭作业。

因为
final
类不能被子类化,所以创建一个内有
字符串
实例的新类,并对该对象进行操作

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

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


这就引出了一个重要的问题:为什么您认为您要这样做?

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

我想,这是一个愚蠢的问题(不是对提问者的反映,而是对在面试中问他的人的反映)。可能问你的人不知道字符串是最终的?否则我想不出他们为什么会问。从你的问题来看,你要找的东西听起来很简单:


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

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

你会注意到这需要大量的输入,这时一个好的IDE就派上用场了

下面的视频展示了IntelliJ IDEA 9是如何做到这一点的


通过这里的各种答案以及提问者的更新和澄清,似乎提问者想要的是一个看起来、闻起来和听起来都像字符串的类,但实际上不是

也就是说,他们希望能够做到:

MyString string = "String!!";
这是不可行的,因为
java.lang.String
是最后一个类,因此编译器生成的每个
“String”
都将是
java.lang.String
对象,因为这不是
MyString
对象,它们不能相互分配


在弱类型语言中,您将能够创建这样一个类,因为如果一个类看起来、闻起来和听起来都像一个,那么就所有的意图和目的而言,它就是一个duck。然而,Java是一种强类型语言,而duck只是一个duck,如果它恰好来自于。

您试图解决的实际问题是什么?我正在尝试找出答案什么样的设计模式最适合这种问题。我一直在想,为什么字符串在Java中是最终的?当然,它提供了我所需要的所有功能,而且从来没有想过一个需要类字符串扩展的操作,但你永远也不会知道有人可能需要什么!@Alex:选择可能会有更多o与安全性有关,而不是设计。不要要求我澄清这一点,因为我认为这只是我可能(或可能没有)读过的东西;-)@Alex,看这里:我不想仅仅通过复制String类的所有方法来创建一个类。这个问题是在一次采访中向我提出的。也许这是一个诡计性的问题,你应该向他们解释为什么这样做会阻止你与几乎任何现有的Java API进行交互操作。采访的另一个答案是p指出String实现了CharSequence,您可以创建其他实现。当然,如果使用ersatz字符串的API需要字符串而不是CharSequence,则这没有帮助。内置的动态代理支持仅适用于接口。ASM和其他字节码库可以用于类,但我不确定最终的classes.我认为真正的挑战在于字符串是最终的。否则答案很简单,不是吗?只要扩展字符串,就可以了。这看起来不错。但是我能做MyString strAbc=“这是我的字符串”吗?我正在寻找字符串的精确副本。在您的解决方案中,我需要在构造函数中传递字符串。@Harsha,您想要的根本不可能。@Paul,您能解释一下吗?@Harsha,我添加了一个答案来解释比这些注释允许的更全面的内容。@Harsha没有问题……如果它有用,并且upvote总是很好的;-)+这是真的。所以用户要求的是字符串副本,而不是委托,委托仍将创建字符串对象。
MyString string = "String!!";