【问题标题】:Why String class is not Cloneable?为什么 String 类不可克隆?
【发布时间】:2014-03-18 18:53:48
【问题描述】:

为什么String 类没有实现Cloneable 接口?

例如:(我们有时会写这种类型的代码。)

String s1 = new String("Hello");

String s2 = new String("Hello");

这里是 s1!=s2;

因此,如果我们可以这样做,而不是这样做:

String s1 = new String("Hello");

String s2 = s1.clone();

这很容易。

【问题讨论】:

  • 为什么会...?为什么要复制/克隆不可变对象。
  • 请查看更新后的问题。
  • 只要String s2 = s1;。没有人能打破这一点。
  • 如果您认为您确实需要两个不同的 String 引用,即使值可能相同,我建议您重新考虑您的设计。这可能意味着您正在尝试做一些“聪明”的事情,以节省一些打字,而不是编码您的意思。不仅聪明的代码可读性差,任何在你的代码中看到s1==s2s1!=s2 的人都可能认为你犯了一个新手错误。
  • 看来这可能是XY problem。也许与其询问s1.clone();,不如解释一下为什么需要单独的不可变对象实例?

标签: java string clone


【解决方案1】:

String 类表示不可变字符串。克隆String 是没有意义的。如果您觉得需要克隆它,那么您可以重复使用相同的引用并达到相同的效果。

即使您可以将clone s1 设为s2,那么s1 != s2 仍将是true。它们仍然是对不同对象的引用。

【讨论】:

    【解决方案2】:

    你可以用

    克隆字符串
    String clonedString = new String(stringToClone);
    

    所以

    String s1 = new String("Hello");
    String s2 = new String(s1);
    

    【讨论】:

    • 但是请看其他答案:如果您的解决方案要求您克隆一个不可变对象,那么您的解决方案可能是其他程序员难以理解的某种狡猾/聪明的技巧。这几乎总是一件坏事。
    【解决方案3】:

    这是另一种方式:

    String s2 = s1.concat("");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-22
      • 2013-03-06
      • 1970-01-01
      • 2012-07-05
      • 2014-08-22
      • 1970-01-01
      • 2012-05-06
      • 2013-03-08
      相关资源
      最近更新 更多